选择排序是一种较为简单的排序算法。它的实现原理是每一次从待排序的数据元素中挑出一个最小(大)的元素,存放在数据的起始(末尾)位置,直到所有待排序的数据排完。
直接插入排序:
当插入第i个元素的时候,我们认为它前面的i个元素已序。
这时候用array[i]的排序吗与前面的排序码进行比较,找到适合的位置就进行插入,原来位置上的元素按顺序向后移动。
时间复杂度: 最差:和所需要的序列相反 O(n^2)
最优:和所需要的系列相同 O(n)
空间复杂度:O(1)
稳定性:不稳定
代码如下:
void InsertSort(int *array, int size) { for (int i = 0; i<size; i++) { int key = array[i]; int end = i-1; while (end >= 0 && key < array[end]) // key <= array[end]不稳定 { array[end+1] = array[end]; end--; } array[end+1] = key; } }
二分插入排序:
在插入排序中,如果比较操作的代价大于数据交换的代价时,这时候二分查找的作用就很明显了。通过二分查找,我们可以减少比较操作的次数。
时间复杂度: 最差:O(N^2)
最优:n O(lgN)
空间复杂度:O(1)
稳定性:稳定
void binarysort(int *array, int size) { for (int i = 0; i < size; i++) { int left = array[0]; int right = array[size - 1]; int mid = 0; int key = array[i]; while (left< right) { mid = left + (left + right) / 2; if (key > array[mid]) left = mid+1; else right = mid+1; } for (int j = i - i; i >= left; j--) { array[j+1] = array[j]; array[left] = key; } } }
当数据量较多的时候,二分插入排序可以很大程度上的减少数据的比较次数。但是当数据接近有序时,直接插入排序就要优于二分插入排序。
希尔排序:
希尔排序又叫“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。把所有数据按照一定的增量分组,分别对每组使用直接插入排序,随着增量的减少,每组包含的关键词越来越多。增量减为1时,排序结束。
希尔排序较之直接插入排序效率高在:直接插入排序每次只能移动一个数据,而希尔排序每次可以移动增量数个数据。排序的时间复杂度大幅度提高。
void shellsort(int *array, int size) { int gap = size; while (gap>1) { for (int i = 0; i<=size; i++) { gap = gap / 3 + 1; int key = array[i]; int end = i + gap; while (end <= size-1 && key > array[end]) { swap(key, array[end]); end = end + gap; } break; } } }