排序有关博客:
http://www.cnblogs.com/vamei/archive/2013/03/12/2948847.html
http://blog.csdn.net/morewindows/article/details/6665714
排序动画(推荐):http://www.sorting-algorithms.com/insertion-sort
1.插入排序
基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。
操作过程:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录开始逐个进行插入,直至整个序列有序。
空间复杂度O(1),时间复杂度O(n2)(取决于原先序列排序情况,最小n-1,最大(n+4)(n-1)/2)
void InsertSort( int a[], int n) { //假设序列a[i]为已经排好序(从小到大); //在后面的序列a[i+1]--a[n-1]中的每个元素与a[i]比较,如果比a[i]小,则交换位置。 //直到所有的元素都已经交换过位置 int i = 0,j = 0; int temp; for( i = 1; i < n; i++) //从序列中的第二个元素开始(假定第一个元素为已经排好序的子序列) { temp = a[i]; //缓存将要与自序列中的元素进行比较的元素a[i]; for(j = i; j > 0 && a[j - 1] > temp; j--) { a[j] = a[j-1]; //将大于temp的元素向后移动一个位置 } a[j] = temp; } }
2.希尔排序
改进版的插入排序,通过比较相隔一定距离的元素;各趟比较所用的距离随着算法的进行而减小,知道只比较相邻的元素的最后一趟排序为止。
空间复杂度:希尔排序的时间复杂度与增量的选取有关。
void ShellSort( int a[], int n) { int i,j, Increment; int temp; for(Increment = n / 2; Increment > 0; Increment /= 2) { for( i = Increment; i < n; i++) { temp = a[i]; for( j = i; j >= Increment; j -= Increment ) { if(temp < a[ j - Increment] ) a[j] = a[j - Increment]; else break; } a[j] = temp; } } }
3.冒泡排序
思想:
(1)将待排序数组a[n]前后两个数据比较,大的放后面。
(2)经过上面一轮循环后,最大的元素沉到了底部。下一轮循环不用比较最后的一个元素,因为已经确定是最大的。
(3)重复上面的步骤。
void BubbleSort(int a[], int n) { int sign = 0; for(int i = 0; i < n; i++) { for(int j = 1; j < n-i; j++) { if(a[j-1] > a[j]) { swap(a[j-1], a[j]); sign = 1; } } if(sign == 0) break; } }
void swap(int *a, int *b) { int temp; if(*a > *b) { temp = *a; *a = *b; *b = temp; } }