常見的4種排序算法

一、冒泡排序java

最簡單的一種排序算法。先從數組中找到最大值(或最小值)並放到數組最左端(或最右端),而後在剩下的數字中找到次大值(或次小值),以此類推,直到數組有序排列。算法的時間複雜度爲O(n^2)。算法

// 冒泡排序
void BubbleSort(int arr[], int length)
{
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length -  i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp;
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

二、選擇排序數組

 每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄做爲有序序列中第i個記錄。具體來講,假設長度爲n的數組arr,要按照從小到大排序,那麼先從n個數字中找到最小值min1,若是最小值min1的位置不在數組的最左端(也就是min1不等於arr[0]),則將最小值min1和arr[0]交換,接着在剩下的n-1個數字中找到最小值min2,若是最小值min2不等於arr[1],則交換這兩個數字,依次類推,直到數組arr有序排列。算法的時間複雜度爲O(n^2)。性能

// 選擇排序
void SelectionSort(int arr[], int length)
{
	for (int i = 0; i < length; i++)
	{
		int index = i;
		for (int j = i+1; j < length; j++)
		{
			if (arr[j] < arr[index])
			{
				index = j;
			}
		}
		if (index == i)
			continue;
		else
		{
			int temp;
			temp = arr[index];
			arr[index] = arr[i];
			arr[i] = temp;
		}
	}
}

 

三、快速排序測試

快速排序的基本思想是:經過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另外一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,已達到整個序列有序。一趟快速排序的具體過程可描述爲:從待排序列中任意選取一個記錄(一般選取第一個記錄)做爲基準值,而後將記錄中關鍵字比它小的記錄都安置在它的位置以前,將記錄中關鍵字比它大的記錄都安置在它的位置以後。這樣,以該基準值爲分界線,將待排序列分紅的兩個子序列。ui

一趟快速排序的具體作法爲:設置兩個指針low和high分別指向待排序列的開始和結尾,記錄下基準值baseval(待排序列的第一個記錄),而後先從high所指的位置向前搜索直到找到一個小於baseval的記錄並互相交換,接着從low所指向的位置向後搜索直到找到一個大於baseval的記錄並互相交換,重複這兩個步驟直到low=high爲止。指針

// 快速排序
void QuickSort(int arr[], int start, int end)
{
	if (start >= end)
		return;
	int i = start;
	int j = end;
	// 基準數
	int baseval = arr[start];
	while (i < j)
	{
		// 從右向左找比基準數小的數
		while (i < j && arr[j] >= baseval)
		{
			j--;
		}
		if (i < j)
		{
			arr[i] = arr[j];
			i++;
		}
		// 從左向右找比基準數大的數
		while (i < j && arr[i] < baseval)
		{
			i++;
		}
		if (i < j)
		{
			arr[j] = arr[i];
			j--;
		}
	}
	// 把基準數放到i的位置
	arr[i] = baseval;
	// 遞歸
	QuickSort(arr, start, i - 1);
	QuickSort(arr, i + 1, end);
}

 

快速排序具備最好的平均性能(average behavior),但最壞性能(worst case behavior)和插入排序blog

相同,也是O(n^2)。好比一個序列5,4,3,2,1,要排爲1,2,3,4,5。按照快速排序方法,每次只會有一個數據進入正確順序,不能把數據分紅大小至關的兩份,很明顯,排序的過程就成了一個歪脖子樹,樹的深度爲n,那時間複雜度就成了O(n^2)。儘管如此,須要排序的狀況幾乎都是亂序的,天然性能就保證了。據書上的測試圖來看,在數據量小於20的時候,插入排序具備最好的性能。當大於20時,快速排序具備最好的性能,歸併(merge sort)和堆排序(heap sort)也可望不可即,儘管複雜度都爲nlog2(n)。排序

四、插入排序遞歸

插入排序的基本思想就是將無序序列插入到有序序列中。

// 插入排序
void InsertSort(int arr[], int length)
{
	for (int i = 1; i < length; i++)
	{
		int j;
		if (arr[i] < arr[i - 1])
		{
			int temp = arr[i];
			for (j = i - 1; j >= 0 && temp < arr[j]; j--)
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;
		}
	}
}
相關文章
相關標籤/搜索