交換排序
氣泡排序(Bubble Sort):
是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。氣泡排序可以說是最簡單的排序方法了,詳細可以參考百度百科。下面簡單的給出程式碼:
#include<iostream> using namespace std; void bubbleSort(int *a, int n); void bubbleSort(int *a, int n) { int i, j, temp; for (j = 0; j < n - 1; j++) for (i = 0; i < n - 1 - j; i++) { if (a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } } int main() { int arry[] = { 11,5,2,1,10,4,6,8,7 }; int length = sizeof(arry) / sizeof(int); bubbleSort(arry, length); for (int i = 0; i <length; i++) { cout << arry[i] << " "; } cout << endl; }
快速排序(Quicksort):
快速排序是對氣泡排序的一種改進,氣泡排序中記錄的比較和移動的比較是在相鄰位置進行的,記錄每次交換隻能後移一個位置,所以總的比較次數較多。但是快速排序中,,記錄的比較和移動是從兩端向中間進行的,關鍵碼較大的記錄一次就能從前面移動到後面,關鍵碼較小的同樣也能一次性移動到前面,這樣總的比較次數大大減少。
快速排序的過程步驟為:(摘自維基百科:)
快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。
1.從數列中挑出一個元素,稱為"基準"(pivot)
2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
3.遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
圖示該過程:
給出該演算法的程式碼:
#include<iostream>
using namespace std;
void quickSort(int *arry,int,int length);
void quickSort(int *arry, int low, int high) {
if (low >= high) {
return;
}
int flag = arry[low];//取陣列的第一個元素作為"軸值"
int last = high; //這裡注意,需要對函式常數引數進行儲存,在遞迴中需要用到。在進行第一次排序後,low和high的值都改變且相等。
int first = low;
while (low < high) {
while (low < high&&arry[high] >=flag) {
--high;
}
arry[low] = arry[high];
while (low < high&&arry[low] <= flag) {
++low;
}
arry[high] = arry[low];
}
arry[low] = flag;//第一次排序後,把flag賦值給"軸值"
quickSort(arry, first,low-1);//遞迴
quickSort(arry, low + 1, last);
}
int main(){
int arry[] = {23,13,49,6,31,19,28};
int length = sizeof(arry) / sizeof(int);
quickSort(arry,0,length-1);
for (int i = 0; i < length; i++) {
cout << arry[i] << " ";
}
cout << endl;
}
快速排序需要找出一個"軸值",第一次排序目的是把小於軸值的放在其左邊,大於軸值的放在其右邊,然後再對軸值的左右兩部分再進行上一步的排序,重複第一步的工作,所以用遞迴演算法來解決該問題。
由於快速排序經常用到,對它的理解十分重要,更多請參考點選開啟連結。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1979604/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 排序之交換排序排序
- 排序:交換排序——氣泡排序法排序
- 交換排序法排序
- 排序(1)--插入排序和交換排序排序
- 非交換排序-計數排序和桶排序排序
- 408 DataStructure_Algorithm - 8.3 交換排序ASTStructGo排序
- 資料結構學習(C++)續——排序【3】交換排序 (轉)資料結構C++排序
- PHP排序演算法(插入,選擇,交換,冒泡,快速)PHP排序演算法
- POJ-2299 Ultra-QuickSort-分治法排序求交換速度UI排序
- 選擇排序中交換資料的不同方式出現的不同結果排序
- 1.1_3_1 電路交換、報文交換、分組交換
- 論HPUX系統交換與偽交換UX
- 軟交換與硬交換的區別
- 交換原理
- 二層交換機 三層交換機 四層交換機的區別
- 交換資料
- 全國產交換機、軍用交換機與普通交換機到底有啥區別?
- 華為交換機和銳捷交換機埠隔離
- 【轉】交換機開發(一)—— 交換機的工作原理
- 交換技術:NGN核心軟交換技術分析(轉)
- 管理型交換機和非管理型交換機區別
- java使用telnet連線交換機並管理交換機Java
- 交換技術:軟交換機的概念、特徵和作用(轉)特徵
- 二層交換機和三層交換機的區別
- 排序:氣泡排序&快速排序排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 交換機基礎
- ACM 交換輸出ACM
- linux swap(交換)Linux
- 鮮花:人格交換
- 交換機測試
- 工業級交換機和網路級交換機區別?
- 工業交換機與商業交換機區別對比
- 資料中心交換機與普通交換機有什麼不同?
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 排序(2)--選擇排序,歸併排序和基數排序排序
- 插入排序排序排序