常見排序算法之插入排序

wKioL1e4TebBy7qSAAEKCEW4XWs175.png

wKiom1e4TebzdeHNAAENhyAGQkY678.jpg


1.直接插入排序shell

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

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

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

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

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

代碼以下:it

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.希爾排序io

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

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;
			}
}