选择排序是一种较为简单的排序算法。它的实现原理是每一次从待排序的数据元素中挑出一个最小(大)的元素,存放在数据的起始(末尾)位置,直到所有待排序的数据排完。
直接插入排序:
当插入第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;
}
}
}