日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法练习day2——190319(大顶堆、冒泡、选择、插入)

發(fā)布時(shí)間:2024/10/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法练习day2——190319(大顶堆、冒泡、选择、插入) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.實(shí)現(xiàn)大頂堆,用于排序

步驟:

  • 從數(shù)組一半的位置開始建堆;
  • 不斷調(diào)整,使最大元素位于頂上
  • 調(diào)整的過程:使根、左孩子、右孩子中的最大值位于根位置;
  • 交換頂元素和末位置元素,同時(shí)元素個(gè)數(shù)-1
  • -1是為了避免已換好的元素再參與比較交換
  • 換好后,再次從頂部進(jìn)行調(diào)整(因?yàn)榻粨Q后,頂元素已不是最大的了)
  • package Heap;public class Test {static int len; // 因?yàn)槁暶鞯亩鄠€(gè)函數(shù)都需要數(shù)據(jù)長(zhǎng)度,所以把len設(shè)置成為全局變量public static void main(String[] args) {int[] array= {4,7,2,8,9,1,3,6,5,0};System.out.println("before:");for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");}System.out.println();System.out.println("after:");heapSort(array);for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");} }public static void buildMaxHeap(int[] arr){// 建立大頂堆len = arr.length;for (int i = len/2; i >= 0; i--) {//建堆,頂為最大heapify(arr, i);}}public static void heapify(int[]arr, int i) {// 堆調(diào)整System.out.println("i:"+i);int left = 2 * i + 1,right = 2 * i + 2,largest = i;if (left < len && arr[left] > arr[largest]) {largest = left;}if (right < len && arr[right] > arr[largest]) {largest = right;}if (largest != i) { swap(arr, i, largest);heapify(arr, largest);//換值后要對(duì)被換根的子樹進(jìn)行調(diào)整}}public static void swap(int[] arr,int i,int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void heapSort(int[] arr) {buildMaxHeap(arr);//先建一個(gè)大頂堆,最大值在頂部,即數(shù)組0位置for (int i = arr.length - 1; i > 0; i--) {swap(arr, 0, i);//將最大值換到最后一個(gè)位置len--; //長(zhǎng)度-1,最后一個(gè)位置的數(shù)就不參與比較置換了,它已為目前的最大值heapify(arr, 0);//將頂元素和最后一個(gè)元素交換后再進(jìn)行堆調(diào)整} }}

    2.冒泡排序

    public class BubbleSort {public static void bubbleSort(int[] arr) {if(arr==null||arr.length<2)return;for(int end=arr.length-1;end>0;end--) {//end為每次比較的范圍//第一次比:0~n-1//第二次比:0~n-1//...for(int i=0;i<end;i++) {if(arr[i]>arr[i+1])swap(arr,i,i+1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;} }

    時(shí)間復(fù)雜度的計(jì)算:

    第一次:0~n-1——n次

    第二次:0~n-2——n-1次

    ...

    總共:

    3.選擇排序

    第一次比較0~n-1,最小的放在0位置;

    第二次比較1~n-1,最小的放在1位置;

    ...

    public class SelectSort {public static void selectSort(int[] arr) {if(arr==null||arr.length<2)return;for(int i=0;i<arr.length;i++) {int minIndex=i;//最小數(shù)的下標(biāo)for(int j=i+1;j<arr.length;j++) {minIndex=arr[minIndex]<arr[j]?minIndex:j;}if(minIndex!=i)swap(arr,i,minIndex);//最小數(shù)和目前i位置的交換}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;} }

    時(shí)間復(fù)雜度還是

    冒泡排序和選擇排序在工程上不怎么用。

    它們的比較流程已確定,和元素具體是什么情況無關(guān),都得比較,有序的話只是不交換而已。

    4.插入排序

    public class InsertSort {public static void insertSort(int[] arr) {if(arr==null||arr.length<2)return;for(int i=1;i<arr.length-1;i++) {//每次插入的元素for(int j=i-1;j>-1;j--)//每次需要比較的元素if(arr[j]<arr[j+1]) {swap(arr,j,j+1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;/*位運(yùn)算實(shí)現(xiàn)交換* arr[i]=arr[i]^arr[j];* arr[j]=arr[i]^arr[j];* arr[i]=arr[i]^arr[j];*/} }

    分最好、最壞和平均。

    最好:已有序,且和要求的順序一致;每次只需和最后一個(gè)元素比較,

    平均:亂序;

    最壞:有序,但和要求順序相反。每次都需要比較到頭,

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的算法练习day2——190319(大顶堆、冒泡、选择、插入)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。