插入排序:从数组第二个元素开始,如果他比前一个元素小,那么用一个帮助空间将他存储起来,然后将他之前比他大的元素通通后移,将他插入最后一个后移的元素之前,对于一个基本有序的数列来说很快捷,时间复杂度为O(n^2);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 10
typedef struct
{
int r[MAXSIZE];
int length;
}SqList;
void InsertSort(SqList *L)
{
int i,j,temp;
for(i=1;i<MAXSIZE;i++)
{
if(L->r[i]<L->r[i-1])/*从第二个元素开始如果比前一个元素小的*/
{
temp=L->r[i];/*保存当前元素*/
for(j=i-1;j>=0&&L->r[j]>temp;j--)/*将在他之前比他大的全部往后移*/
{
L->r[j+1]=L->r[j];
}
L->r[j+1]=temp;
}
}
}
int main()
{
SqList *L =(SqList*)malloc(sizeof(SqList));
printf("排序前\n");
int i;
srand(time(NULL));
for(i=0;i<10;i++)
{
L->r[i]=rand()%15+1;
L->length++;
printf("%d ",L->r[i]);
}
printf("\n");
InsertSort(L);
printf("排序后:\n");
for(i=0;i<MAXSIZE;i++)
{
printf("%d ",L->r[i]);
}
printf("\n");
return 0;
}
希尔排序:也是插入排序,不过插入排序的增量序列是1,而希尔排序的增量序列随着循环而改变,一般初始默认维数组长度的1/3+1,他的时间复杂度为O(n^3/2);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 10
typedef struct
{
int r[MAXSIZE];
int length;
}SqList;
void ShellSort(SqList *L)
{
int i,j,temp;
int increment=L->length;
do
{
increment = increment/3+1;/*增量序列*/
for(i=increment;i<L->length;i++)
{
if(L->r[i]<L->r[i-increment])/*如果当前元素小于之前的元素*/
{
temp = L->r[i];
for(j=i-increment;j>=0&&temp<L->r[j];j-=increment)/*将前面所有比他大的元素往后移increment个单位*/
{
L->r[j+increment]=L->r[j];
}
L->r[j+increment]=temp;/*将该元素插入到哪*/
}
}
}
while(increment>1);
}
int main()
{
SqList *L =(SqList*)malloc(sizeof(SqList));
printf("排序前\n");
int i;
srand(time(NULL));
for(i=0;i<10;i++)
{
L->r[i]=rand()%15+1;
L->length++;
printf("%d ",L->r[i]);
}
printf("\n");
ShellSort(L);
printf("排序后:\n");
for(i=0;i<MAXSIZE;i++)
{
printf("%d ",L->r[i]);
}
printf("\n");
return 0;
}