Java常見4種排序

2021-07-28 13:13:01 字數 3364 閱讀 3402

排序

看到資料排序這節所以把排序的常見方法都整理下。

(一)氣泡排序

:從最左邊開始對兩個數進行比較,如果第i個數大於第i+1個數,兩個數就交換,不斷重複。

最好時間複雜度o(n)

最壞時間複雜度o(n² )

平均時間複雜度o(n² )

public class arraydemo06;

for(int i =1;i

for(int j=0;j

if(score[i]

int temp=score[i];

score[i]=score[j];

score[j]=temp; }

} }for(int i =0;i

system.out.println(score[i]+"\t"); }

} }(二)快速排序

最好時間複雜度o(nlogn)

最糟糕時複雜度為o(n^2)

平均時間複雜度為o(nlogn)

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第乙個小於key的值a[j],將a[j]和a[i]互換;

4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的a[i],將a[i]和a[j]互換;

5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為 止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

public void sort(int arr,int low,int high)

if(l

int temp=arr[h];

arr[h]=arr[l];

arr[l]=temp;

l++; }

while(l

l++; }

if(l

int temp=arr[h];

arr[h]=arr[l];

arr[l]=temp;

h--; }

}if(l>low)sort(arr,low,l-1);//對低字段表進行遞迴排序

if(h }

(三)歸併排序

:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第乙個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中乙個有序表取完,然後再將另乙個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。

最壞、最佳、平均情況下時間複雜度均為o(nlogn).從合併過程中可以看出合併排序穩定。

演算法:/**

* 歸併排序

* 簡介:將兩個(或兩個以上)有序表合併成乙個新的有序表 即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列

* 時間複雜度為o(nlogn)

* 穩定排序方式

* @param nums 待排序陣列

* @return 輸出有序陣列 */

public static int sort(int nums, int low, int high)

return nums; }

/*** 將陣列中low到high位置的數進行排序

* @param nums 待排序陣列

* @param low 待排的開始位置

* @param mid 待排中間位置

* @param high 待排結束位置 */

public static void merge(int nums, int low, int mid, int high) else }

// 把左邊剩餘的數移入陣列

while (i <= mid)

// 把右邊邊剩餘的數移入陣列

while (j <= high)

// 把新陣列中的數覆蓋nums陣列

for (int k2 = 0; k2 < temp.length; k2++) }

例:如 設有數列

初始狀態:6,202,100,301,38,8,1

第一次歸併後:,,,,比較次數:3;

第二次歸併後:,,比較次數:4;

第三次歸併後:,比較次數:4;

總的比較次數為:3+4+4=11,;

逆序數為14;

(四)堆排序

:初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存序,使之成為乙個 堆,這時堆的根節點的數最大。然後將根節點與堆的最後乙個節點交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對 它們作交換,最後得到有n個節點的有序序列。從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。

平均時間複雜度o(n*logn)

public class heapsort ;

int arraylength=a.length;

//迴圈建堆

for(int i=0;i

//建堆

buildmaxheap(a,arraylength-1-i);

//交換堆頂和最後乙個元素

swap(a,0,arraylength-1-i);

system.out.println(arrays.tostring(a)); }

}//對data陣列從0到lastindex建大頂堆

public static void buildmaxheap(int data, int lastindex) }

//如果k節點的值小於其較大的子節點的值

if(data[k]

//交換他們

swap(data,k,biggerindex);

//將biggerindex賦予k,開始while迴圈的下一次迴圈,重新保證k節點的值大於其左右子節點的值

k=biggerindex;

}else }

} }//交換

private static void swap(int data, int i, int j) }

最後找到乙個常用排序演算法的時間複雜度和空間複雜度**。

氣泡排序4種寫法 java

寫一點自己對冒牌排序的理解 int arr new int length 1,通過對比相鄰2個數,得到最大 最小數 1 從前往後比,每次篩選出最後一位for int i 0 i第一輪對比得到最後乙個位置的準確數。第二輪對比應該只比到倒數第二位,依次類推,另一種寫法 for int i arr.len...

八種常見排序演算法java實現

目錄 1.直接插入排序 2.希爾排序 3.簡單選擇排序 4.堆排序 5.氣泡排序 6.快速排序 7.歸併排序 8.基數排序 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直...

排序 4種排序

1.氣泡排序 穩定 o n n 比較相鄰的元素,如果前乙個比後乙個大,就把她們兩個調換位置 對每一對相鄰的元素作同樣處理,從開始到最後一對,這步做完後,最後的元素會是最大的數。氣泡排序 從小到大排序,從第乙個元素開始,相鄰元素比較,j比j 1大的,交換位置。public class bubbleso...