常見排序算法之插入排序

wKioL1e4TebBy7qSAAEKCEW4XWs175.png

wKiom1e4TebzdeHNAAENhyAGQkY678.jpg


1.直接插入排序

直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子序列中的適當位置,直到全部記錄插入完成爲止。

設數組爲a[0…n-1]。

1.      初始時,a[0]自成1個有序區,無序區爲a[1..n-1]。令i=1

2.      將a[i]併入當前的有序區a[0…i-1]中形成a[0…i]的有序區間。

3.      i++並重復第二步直到i==n-1。排序完成。

代碼如下:

void InsertSort(int* a, size_t n)  //直接插入排序
{
	assert(a);
	for (int i = 1; i < n; ++i)
	{
		int tmp = a[i];
		int j = i - 1;
		while (j >= 0 && a[j] > tmp)
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = tmp;
	}
}


2.希爾排序

該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因爲直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

void shellsort2(int a[], int n)
{
	int j, gap;
	
	for (gap = n / 2; gap > 0; gap /= 2)
		for (j = gap; j < n; j++)//從數組第gap個元素開始
			if (a[j] < a[j - gap])//每個元素與自己組內的數據進行直接插入排序
			{
				int temp = a[j];
				int k = j - gap;
				while (k >= 0 && a[k] > temp)
				{
					a[k + gap] = a[k];
					k -= gap;
				}
				a[k + gap] = temp;
			}
}


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