一. 直接插入排序
时间复杂度为O(n^2) 元素移动是顺序的 所以为稳定排序
在一个数组中,将第一个元素看作排序元素序列里的唯一元素,然后申请一个空间出来,首先存放第二元素,即可在数组中空第二个元素位置(即此位置可被覆盖),将第二个元素与有序序列里面唯一一个元素进行比较,根据排序条件决定元素交换与否,然后有序序列元素加一,申请空间里面存放将要插进有序序列里面的元素;
具体代码如下:
void insertsort(int *array,int n)
{
int j = 0,i = 0;
for(i = 1;i < n;i++)
{
int temp = array[i];
for( j = i-1 ; j >= 0 ; j--)
{
if(temp < array[j])
{
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = temp;
}
}
二 折半插入排序
时间复杂度 O(N^2) 稳定排序
在直接插入排序的基础上加上折半查找思想
代码如下:
void binaryinsertsort(int *array,int n)
{
int i = 1,j = 0,left = 0,right = 0;
for(i = 1; i < n;++i)
{
int temp = array[i];
j = i - 1;
left = 0;
right = j;
//while 找到元素要插入的位置
while(left < right)
{
//middle = (left + right)/2 防止越界
middle = left + (right-left)/2;
if(array[middle] <= temp)
{
left = middle + 1;
}else{
right = middle - 1;
}
}
//将要插入元素位置数据依次往后移
for(j = i - 1;j >= left;j--)
{
array[j + 1] = array[j];
}
//存入数据
array[left] = temp;
}
}
三. 希尔排序
时间复杂度O(N^1.3) 介于O(N^2)与O(N(log 2 N))之间 (元素跳着移动)不稳定排序
希尔排序是将数据元素根据不同间隔分为多个交叉又各自独立进行插入排序的子序列,每趟结束数据的有序性提高
代码如下:
void shellsort(int *array,int n)
{
int i = 0, j = 0,temp = 0;
int gap = n/2;
while(gap > 0)
{
//j为待排序的元素位置 插入元素gap~(n-1)
for(i = gap ;i < n; ++i)
{
temp = array[i];
//直接插入排序的部分
for(j = i - gap;j >= 0;j -= gap)
{
if(temp < array[j])
{
array[j+gap] = array[j] ;
}else{
break;
}
}
array[j + gap] = temp;
}
gap = gap/2;
}