1. 程式人生 > >資料結構——選擇排序、插入排序、氣泡排序、快速排序

資料結構——選擇排序、插入排序、氣泡排序、快速排序

前言

排序方法按原理、其它說明、圖示、c++程式碼案例四個方面來分析

選擇排序

原理:將初始序列(A[0]~A[n-1])作為待排序序列,第一趟在待排序序列(A[0]~A[n-1])中找到最小值(或最大值)元素,將其與第一個元素A[0]交換,這樣子序列(A[0])已經有序,下一趟在排序在待排序子序列(A[1]~A[n-1])中進行。第i趟排序在待排序子序列(A[i-1]~A[n-1])中找到最小值(或最大值)元素,與該子序列中第一個元素A[i-1]交換。經過 n-1 趟排序後使得初始序列有序。
其他說明:選擇排序的最好、最壞和平均情況的時間複雜度都為,而且它還需交換元素(n-1)次和移動元素3(n-1)次;它是不穩定的排序演算法。
圖示
C++程式碼
/*<2016-12-18>Amusi
Description: Selectiion sort
*/
#include

using namespace std;

void selec_sort(int queue[],int n)
{
	int i, j;
	for (i = 0; i < n - 1;i++)
	{
		int temp;
		for (j = i+1; j < n; j++)
		{
			//獲得當前子序列的最小值,並與子序列的首元素交換
			if (queue[j]

插入排序

原理:假設第一個元素排好,並作為一個有序序列,對於未排序序列(剩下的n-1個元素),在有序序列中從後向前掃描,找到相應位置,依次插入該有序序列(元素逐漸增多),每插入一個元素後依然保持該序列有序,經過 n-1 趟排序後使初始序列有序。
其他說明:插入排序在最好的情況下時間複雜度為O(n),比較次數為(n-1)次,移動元素次數是2(n-1);插入排序最差的方法排序;插入排序是穩定的排序演算法。(此方法較難理解,需多編寫程式碼理解
直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的紀錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到一個新的有序序列。
例如,已知待排序的一組紀錄是:60,71,49,11,24,3,66假設在排序過程中,前3個紀錄已按關鍵碼值遞增的次序重新排列,構成一個有序序列:49,60,71將待排序紀錄中的第4個紀錄(即11)插入上述有序序列,以得到一個新的含4個紀錄的有序序列。首先,應找到11的插入位置,再進行插入。可以講11放入陣列的第一個單元r[0]中,這個單元稱為監視哨,然後從71起從右到左查詢,11小於71,將71右移一個位置,11小於60,又將60右移一個位置,11小於49,又再將49右移一個位置,這時再將11與r[0]的值比較,11≥r[0],它的插入位置就是r[1]。假設11大於第一個值r[1]。它的插入位置應該在r[1]和r[2]之間,由於60已經右移了,留出來的位置正好留給11.後面的紀錄依照同樣的方法逐個插入到該有序序列中。若紀錄數n,續進行n-1趟排序,才能完成。直接插入排序的演算法思路:
(1) 設定監視哨r[0],將待插入紀錄的值賦值給r[0];(2) 設定開始查詢的位置j;(3) 在陣列中進行搜尋,搜尋中將第j個紀錄後移,直至r[0].key≥r[j].key為止;(4) 將r[0]插入r[j+1]的位置上。
圖示
C++程式碼
/*<2016-12-18>Amusi
Description: Insert sort
*/
#include

using namespace std;
//插入排序函式
void Insert_sort(int queue[],int n)
{
	int i, j, temp;
	for (i = 1; i < n;i++)	//n-1趟
	{
		temp = queue[i];	//待插入元素——監視哨
		for (j = i - 1; j >= 0 && queue[j]>temp; j--)//從後向前(即從右向左)
		{
			queue[j + 1] = queue[j];	//右移
		}
		queue[j + 1] = temp;//
	}
}

void print(int queue[],int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << queue[i] << "\t";
	}
	cout << endl;
}

int main()
{
	int queue1[] = { 3, 4, 1, 2, 4, 67, 213, 13, 123, 34, 1, 99 };
	int N = sizeof(queue1) / sizeof(int);
	cout << "未排序的序列:\t";
	print(queue1, N);
	
	Insert_sort(queue1, N);

	cout << "排序後的序列:\t";
	print(queue1, N);

	system("pause");
	return 0;
}

氣泡排序

原理:第一趟在序列(A[0]~A[n-1])中從前往後進行兩個相鄰元素的比較,若後者小,則交換,比較 n-1 次;第一趟排序結束,最大元素被交換到A[n-1]中,下一趟排序只需要在子序列(A[0]~A[n-2])中進行;氣泡排序最多進行 n-1 趟。基本的氣泡排序可以利用旗標的方式稍微減少一些比較的時間,當尋訪完序列後都沒有發生任何的交換動作,表示排序已經完成,而無需再進行之後的比較與交換動作。 其他說明:氣泡排序最好的情況下只需進行一趟排序,(n-1)次比較,此時的時間複雜度為O(n),無需移動元素;最壞的情況下進行 n-1 趟排序,時間複雜度為O(n2);氣泡排序是穩定的排序演算法

快速排序


附錄

排序方法比較
插入排序&選擇排序:http://blog.csdn.net/booirror/article/details/45339387
氣泡排序:http://blog.csdn.net/booirror/article/details/45336785
快速排序:http://blog.csdn.net/booirror/article/details/45342857
其它:https://zhidao.baidu.com/question/383709870.html