就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置。
將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。
氣泡排序、快速排序
說明:
1. 以下方法最後結果均按照公升序排列
2. 用4,2,1,3,7,4,5,8,3,5序列進行測試
(1)基本思想
在n個待排序陣列中選取待排序數列中的第乙個元素x與第二個元素y進行比較,如果x>y則,將個元素交換位置,否則,選取第二個元素與第三個元素進行比較,以此類推,知道最後兩個元素比較完成,則完成一趟排序,此時最後乙個元素已經是這個序列中最大的乙個元素,第二趟排序時只需在前n-1個元素中進行即可。
(2)**實現
(3)執行結果public
void
bubblesort(int arr)
}print(arr);
if (flag) }}
(4)效能
①穩定性:穩定
②時間複雜度:o(n^2)
(1)基本思想
從待排序陣列中選取乙個元素作為關鍵字(這裡選取待排序序列中的第乙個元素作為關鍵字),角標為key,分別定義乙個指向開始和結尾的指標l和h,如果l所指元素在h所指元素的前面,則從兩端到中間將各個元素與關鍵字進行比較,如果height指向的元素小於等於關鍵字,則執行h–操作,直到l==h或者h所指元素小於關鍵字,如果l指向的元素大於等於關鍵字,則執行l++操作,直到l==h或者l指向的元素大於關鍵字,如果h找到小於關鍵字的元素並且l找到大於關鍵字的元素則將h和l指向的元素交換位置,然後繼續從兩邊向中間進行比較,直到h和l指向同乙個元素,將該元素與關鍵字交換位置,完成一趟排序,此時以關鍵字為界會將陣列劃分成兩個區域,然後在分別對兩段陣列進行排序,直到待排序區域中只有乙個元素,完成排序。
一句話總結,就是通過交換實現關鍵字左邊的元素不大於關鍵字,關鍵字右邊的元素不小於關鍵字。
(2)**實現
說明:為什麼要先從尾部開始進行迴圈?public
static
void
quicksort(int arr, int low, int height)
while (arr[key] >= arr[l] && l < h)
// 將小於關鍵字和大於關鍵字的元素交換位置
if (l < h)
}// 將關鍵字換到合適的位置
swap(arr, key, l);
print(arr);
// 以關鍵字為界限將待排序元素劃分成 兩個區域分別進行快速排序
if (low < l - 1)
quicksort(arr, low, l - 1);
if (l + 1
< height)
quicksort(arr, l + 1, height);
}
想一想這個例子,將9, 4, 2, 1, 3, 7, 4, 5, 8, 3, 10用快排排序
如果我們首先選9作為關鍵字並在迴圈部分用下面的**結果如何?
當l指向10時會因為arr[key] < arr[l]跳出迴圈,而此時l==h也同時滿足,也就是說l和h指向同乙個位置,都指向元素10,按照程式的邏輯,此時key指向的元素要和l指向的元素進行交換,也就是10要換到9的左邊,交換為10, 4, 2, 1, 3, 7, 4, 5, 8, 3, 9,這就出現了問題,比關鍵字大的元素到了關鍵字的左邊,而用正確順序的**則沒有這個問題,所以,我們必須從右邊開始,也就是從基數的對面開始。while (arr[key] >= arr[l] && l < h)
while (arr[key] <= arr[h] && l < h)
(3)執行結果
(4)效能
①穩定性:不穩定
②時間複雜度:
平均效能o(nlogn) (n倍的log以2為底n的對數)
最壞情況o(n^2)
交換排序演算法
快速排序 為啥叫快速排序,因為速度快,效率高 1.先找乙個數作為基準。作為基準的這個數,一趟排下來,左邊的數必小於它,右邊的數必大於它,也就是說,它找到了自己的位置。2.將兩個指標i,j分別指向表的起始 基準 和最後的位置。3.比較j指標的數字是否小於基準,j 直到j小於基準,交換位置 4.比較i指...
排序演算法 交換排序
交換排序的基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時則進行交換,直到沒有反序的元素為止。1.氣泡排序 交換排序 演算法 氣泡排序 bubble sort 輸入 待排序元素的陣列,待排序元素個數 輸出 原理 通過無序區中相鄰元素間關鍵字的比較和位置的交換,使關鍵字最小的元素如氣泡一...
排序演算法 交換排序
基本思想 在乙個待排序序列中,兩兩比較元素的排序碼,如果不滿足次序要求則進行交換,直到整個排序序列滿足要求。思想 對待排序序列從前向後,依次比較相鄰元素的排序碼,若發生逆序,則進行交換。實現 include void bubblesort int p,int n if flag 減少不必要的比較 r...