插入排序
排序思想
直接插入排序就是把待排序的记录按关键字的大小逐个插入到一个已经排好序的有序序列中,直到所有记录插入完为止。
我们可以假设序列第一个元素是已经排好序的,要插入第i(i>=1)个元素,可以将array[i]与排好序的每个元素相比较,知道找到一个比array[i]要小的元素插入到这个元素后面。原来的元素后移。
void InsertSort(int *array, int size)
{
int i = 1;
for(; i < size; i++){
int key = array[i]; //key是当前要插入的元素
int end = i-1; //end指向排好序的最后一个元素
while(end >= 0 && array[end] > key){
array[end+1] = array[end];
end--;
}
array[end+1] = key;
}
}
如上图可见,直接插入排序是稳定的
时间复杂度O(n2)
空间复杂度O(1)
当序列越接近有序排序效率越高
希尔排序
基本思想
先选定一个整数,把待排序序列中所有记录分成若干组,先对每一组内的记录进行排序,然后重复上述分组和排序工作,直到分组为1,所有记录排好序。
void ShellSort(int *array, int size)
{
int gap = 3;
while(gap--){
int i = gap;
for(; i < size; i++){
int end = i-gap;
int key = array[i];
while(end >= 0 && array[end] > key){
arra[end+gap] = array[end];
end -= gap;
}
array[end+gap] = key;
}
}
}
希尔排序是对直接插入排序的优化
gap>1是为了让序列更接近有序,当gap=1,这样会更快
希尔排序是不稳定的
平均时间复杂度O(n1.3~n2)