交換排序

Diy_os發表於2016-01-20
交換排序是一類藉助“交換"進行排序的方法,其主要思想是:在待排序序列中選兩個記錄,將它們的關鍵碼進行比較,如果反序則交換它們的位置。下面主要介紹交換排序中的氣泡排序和快速排序方法。
氣泡排序(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章