【複習總結】一些簡單的排序算法

1.  冒泡排序,冒泡排序屬於簡單排序的一種,也是大多數人學會的第一個排序算法,其基本思想是,從左到右掃描每個數據,跟它相鄰的比較,如果大小順序不對,就交換兩個數據的位置,這種算法的最壞時間複雜度爲n^2,屬於穩定排序的一種,然而,冒泡排序由於時間複雜度比較高,所以往往並不是最優算法,然而,它有一個別的算法所不具備的優點就是,能夠方便的對鏈表進行排序,該算法的代碼如下:
void Bubble_Sort(int A[],int N)
{
       for(int i=0;i<N;++i)
       {
             for(int j=0;j<i;++j)
             {
                  if(A[j]>A[j+1])
                  {
                         int temp=A[j];
                         A[j]=A[j+1];
                         A[j+1]=temp;
                   }
             }
        }
}         
2. 插入排序,插入排序原理,就像我們平時打撲克,整理牌一樣,抓一張,跟手裏最右面一張比,比第一張小,第一張向右移動一下,然後再跟第二張比,找到合適位置,就將其插進去,這種算法也是屬於簡單算法的一種,最壞的時間複雜度爲n^2 ,也是一種效率比較低的排序,然而,插入排序的意義,在我理解,應該是作爲希爾排序的基礎,該算法代碼如下:
void insert_sort(int ElementType[],int N)
{
	for (int i = 1; i < N; ++i)
	{
		int temp = ElementType[i];
		for (int j = i; j>0 && ElementType[j - 1] > temp; --j)
		{
			ElementType[j] = ElementType[j - 1];
			ElementType[j - 1] = temp;
		}
	}
}

3.選擇排序,選擇排序 的原理是,從i開始,到最後,找最小的,交換最小的和i位置的數據,i就是第一次循環的循環控制變量,這種排序最壞時間複雜度也是n^2,選擇排序是作爲堆排序的基礎,由選擇排序可以演化爲堆排序,實現代碼如下:

int ScanForMin(int ElementType[], int start,int end)
{
	int result = 0;
	int temp = ElementType[0];
	for (int i = start; i < end; ++i)
	{
		if (ElementType[i] < temp)
		{
			temp = ElementType[i];
			result = i;
		}
	}
	return result;
}

void swap(int &a, int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
void selection_sort(int ElementType[], int N)
{
	for (int i = 0; i < N; ++i)
	{
		int MinPosition = ScanForMin(ElementType, i, N-1 );
		if (MinPosition!=i)
			swap(ElementType[i], ElementType[MinPosition]);
	}
}

希爾排序,希爾排序的原理是,先比較相隔N個的元素的大小,然後縮小N的值,再來一遍,比如,第一次,每個五個比一次,第二次,每隔三個比一次,最後一次,再比較相鄰兩個,比較相鄰兩個的時候,整個數組已經基本有序了,當然理想情況下是基本有序,存在一種情況,前幾次排序並沒有使順序發生任何變化,白做了幾次循環,使得時間複雜度異常大,超過冒泡和插入,所以,SedgeWick提出一種希爾增量,增量使用4^i-3*2^i+1這個公式 算出,使最壞時間複雜度降爲n^(4/3),而平均時間複雜度只是個理論值爲:n^(7/6)但是,這種希爾排序,在大量數據排序時,確實是效率相當高的,SedgeWick增量希爾排序實現代碼如下:
int sedgewick[] = {  // Sedgewick增量 4^i-3*2^i+1
	1073643521, 603906049, 268386305, 150958081, 67084289,
	37730305, 16764929, 9427969, 4188161, 2354689,
	1045505, 587521, 260609, 146305, 64769,
	36289, 16001, 8929, 3905, 2161,
	929, 505, 209, 109, 41,
	19, 5, 1, 0 };

void Shell_Sort(int ElementType[], int N)
{
	for (int *i = sedgewick; *i > N;i++)
	{
		for (int j = 1; j < N; ++j)
		{
			int temp = ElementType[j];
			for (int k = j; k>0 && ElementType[k - 1]>temp; --k)
			{
				ElementType[k] = ElementType[k - 1];
				ElementType[k - 1] = temp;
			}
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章