插入排序:插入排序分为直接插入排序、希尔排序。希尔排序是直接插入排序的优化算法。
直接插入排序基本思想是:把待排序的数按照其大小逐个插入到已经排序好的有序序列中,直到所有的插入结束得到一个新的序列。
void InsertSort(int array[], int size)
{
for (int i = 1; i < size; i++){
int k = array[i];
int j;
for (j = i - 1; j >= 0; j--){
if (array[j]<=k){
break;
}
//进行数据向后的搬移
array[j + 1] = array[j];
}
//将原来的数据插入到搬移以后留下的位置
array[j + 1] = k;
}
}
直接插入排序的特性总结:时间复杂度O(n*n),空间复杂度O(1),是一个稳定的排序。元素集合越接近有序,直接插入排序算法的时间效率越高。其外部的循环实现减治过程,一次取一个数插入到前面的有序区间内(有序区间进行向后面搬移)。其内部循环实现的是插入过程。
希尔排序基本思想是:先选定一个整数,把待排序中的数分成组,所有距离为在同一个组内,并对每一个组进行排序。然后重复上述分组的过程,当组距达到1时,说明已经有序了。
void InsertSortWithGap(int array[], int size, int gap)
{
for (int i = 1; i < size; i++){
int k = array[i];
int j;
for (j = i - gap; j >= 0; j -= gap){
if (array[j]<=k){
break;
}
//进行数据搬移
array[j + gap] = array[j];
}
//将原来的数据插入到搬移以后留下的位置
array[j + gap] = k;
}
}
void ShellSort(int array[], int size)
{
int gap = size;
while (1){
gap = gap / 3 + 1;
InsertSortWithGap(array, size, gap);
if (gap == 1){
break;
}
}
}
希尔排序的特性总结:时间复杂度O(n^1.3–n*n),空间复杂度O(1),是一个不稳定的排序。当gap>1时都是预排序,目的是为了让数组更接近与有序。当gap==1时,数组已经接近有序了。