排序
看到資料排序這節所以把排序的常見方法都整理下。
(一)氣泡排序
:從最左邊開始對兩個數進行比較,如果第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...