插入排序的种类有很多,首先是最简单的直接插入排序;
直接插入排序:基本操作是将一个数据插入到已经排序好的数据里面;
#include<stdio.h>
#include<stdlib.h>
void InsertSort(int *array,int length)
{
int i,k;
for(i=2;i<=length;i++)
{
if(*(array+i) < *(array+i-1))
{
//*array作为监视哨
*array = *(array+i);
*(array+i) = *(array+i-1);
//数字后移,插入到正确的位置
for(k=i-2;*array<*(array+k);k--)
*(array+k+1) = *(array+k);
*(array+k+1) = *array;
}
}
}
int main()
{
int i,length;
int *array;
scanf("%d",&length);
array = (int*)malloc(sizeof(int)*(length+1));
if(!array)exit(1);
for(i=1;i<=length;i++)
scanf("%d",array+i);
InsertSort(array,length);
for(i=1;i<=length;i++)
printf("%d ",*(array+i));
printf("\n");
free(array);
return 0;
}
折半插入排序:减少比较次数的插入排序,但是时间复杂度不变
#include<stdio.h>
#include<stdlib.h>
void BInsertSort(int *array,int length)
{
int i,k;
int low,high,mid;
for(i=2;i<=length;i++)
{
low = 1;high=i-1;
*array = *(array+i);
//在数组中折半查找有序的位置
while(low <= high)
{
mid = (low+high)>>1; //折半
if(*array < *(array+mid)) high = mid-1; //插入点在低半区
else low = mid+1; //插入点在高半区
}
//后移
for(k=i-1;k>=high+1;k--)
*(array+k+1) = *(array+k);
*(array+high+1) = *array;
}
}
int main()
{
int i,length;
int *array;
scanf("%d",&length);
array = (int*)malloc(sizeof(int)*(length+1));
if(!array)exit(1);
for(i=1;i<=length;i++)
scanf("%d",array+i);
BInsertSort(array,length);
for(i=1;i<=length;i++)
printf("%d ",*(array+i));
printf("\n");
free(array);
return 0;
}
现在在重新写一遍,加深印象
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void insertsort(int array[],int length)
{
int i,tmp,k;
for(i=1;i<length;i++)
{
tmp = array[i];
for(k=i;k>0&&array[k-1]>tmp;k--)
array[k] = array[k-1];
array[k] = tmp;
}
}
void bubblesort(int array[],int length)
{
int i,k,tmp;
for(i=0;i<length;i++)
{
for(k=0;k<length-i-1;k++)
{
if(array[k] > array[k+1])
{
tmp = array[k];
array[k]=array[k+1];
array[k+1]=tmp;
}
}
}
}
void shellsort(int array[],int length)
{
int i,k,tmp,increase;
for(increase=length/2;increase >0;increase /= 2)
{
for(i=increase;i<length;i++)
{
tmp = array[i];
for(k=i;k>=increase&&array[k-increase]>tmp;k-=increase)
array[k] = array[k-increase];
array[k] = tmp;
}
}
}
int main()
{
int i;
int array[10];
srand((unsigned)time(NULL));
for(i=0;i<10;i++)
array[i] = rand()%1000;
shellsort(array,10);
for(i=0;i<10;i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}