小的浮起,大的沉底
具體做法:
第一趟:第1個與第2個比較,大則交換;第2個與第3 比較,大則交換,… 關鍵字最大的記錄交換到最後乙個位置上;
第二趟:對前n-1個記錄進行同樣的操作,關鍵字次大 的記錄交換到第n-1個位置上;依次類推,則完成排序。
public static void main(string args) ; //0號單元未使用
bubblesort(test);
for(int i = 1; i <= test.length-1; i++)
system.out.print(test[i]+" ");
}}執行結果:
正序:只需進行一趟排序,在排序過程中進行n-1次關鍵字間的比較,且不移動記錄;時間複雜度為o(n) 。
逆序:需要進行n-1趟排序,需要進行n(n-1)/2次比較,並作等數量級的記錄移動。總的時間複雜度為o(n^2) 。
起泡排序方法是穩定的。適合於資料較少的情況。
背景:起泡排序的過程可見,起泡排序是乙個增加有序序列長度的過程,也是乙個縮小無序序列長度的過程,每經過一趟起泡,無序序列的長度只縮小 1。試設想:若能在經過一趟排序,使無序序列的長度縮小一半,則必能加快排序的速度。
基本思想:通過一趟排序將待排序列以樞軸為標準劃分成兩部分,使其中一部分記錄的關鍵字均比另一部分小,再分別對這兩部分進行快速排序,以達到整個序列有序。通常取第乙個記錄的值為基準值或樞軸。
具體做法:附設兩個指標low和high,初值分別指向第乙個記錄和最後乙個記錄,設樞軸為 key;
(1)從high 所指位置起向前搜尋,找到第乙個不大於基準值的記錄與樞軸記錄相互交換;
(2)從low 所指位置起向後搜尋,找到第乙個不小於基準值的記錄與樞軸記錄相互交換。
(3)重複這兩步直至low=high為止。
//迴圈結束時,一定有low==high
l[low] = l[0];
return low; }
//遞迴形似的快速排序
public static void quicksort(int l, int low, int high)
//low==high時,說明子串行中僅有乙個元素了,顯然已經有序,應作為每一層遞迴的結束
} public static void main(string args) ; //0號單元未使用
quicksort(test, 1, test.length-1);
for(int i = 1; i <= test.length-1; i++)
system.out.print(test[i]+" ");
}}執行結果:
最好的情形(左、右子區間的長度大致相等),快速排序的最好時間複雜度應為o(nlog2n)。
最壞的情形(每次能劃分成兩個子區間,但其中乙個是空),快速排序的最壞時間複雜度為o(n^2),退化成氣泡排序。
對n較大的情況,它是平均速度最快的排序演算法,但當n很小時,此方法往往比其他簡單排序方法還要慢。
快速排序是不穩定的。
資料結構 排序之交換排序
本節將兩種交換排序氣泡排序和快速排序 氣泡排序是最簡單的交換排序方法,比較相鄰兩個記錄的關鍵字,將大的放到右邊,小的放到左邊,如圖所示 從而使關鍵字小的左移 大的右移 每一次迴圈最右邊的必定是關鍵字最大的元素,外面再加一層迴圈即可得到有序序列。實現 include using namespace s...
資料結構 排序演算法之交換排序(氣泡排序 快速排序)
1 冒泡 void bubblesort int a,int n 1 設定一標誌性變數pos,用於記錄每趟排序中最後一次進行交換的位置。由於pos位置之後的記錄均已交換到位,故在進行下一趟排序時只要掃瞄到pos位置即可。改進後演算法如下 void bubble 1 int r,int n i pos...
資料結構 排序演算法之交換排序(氣泡排序快速排序)
排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減排列起來的操作。交換排序 所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是 將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。氣泡排序演算法 演算法思想 演...