直接插入排序:
(1) 基本思想:
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。
直接用一个事例来解释说明:
给一无序的数列:49,38,65,97,76,13,27,49
对于这个进行直接插入排序,如图:
代码:
#include<stdio.h>
void InsertSort(int *arr,int len) //直接插入排序
{
int tmp=arr[0];
for(int i=0;i<len;i++)
{
int j=i-1; //j始终在i的后面
tmp=arr[i]; //tmp保存数组arr的值,作为标记
while(j>=0 && arr[j]>tmp) //当大于的时候就交换
{
arr[j+1]=arr[j];
--j; //如果一次交换没有调整完全,就回退,继续比较交换
}
arr[j+1]=tmp; //更新保存的tmp值
}
}
void show(int*arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d\n",arr[i]);
}
printf("\n");
}
int main()
{
int arr[]={12,45,5,17,26,3,82,36,45,23,79};
int len=sizeof(arr)/sizeof(arr[0]);
InsertSort(arr,len);
show(arr,len);
return 0;
}
希尔排序:
(1)希尔排序是基于插入排序的以下两点性质而提出的改进方法:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
(2)基本思想:
这种方法是一种分组插入排序。就是说 比较相隔较远距离(称之为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素进行交换。
算法先将排序的一组数按某个增量d分成若干个分组,每组记录的下标相差d。对每一个组内的全部元素进行排序,然后再用一个小的增量对它进行,在每组中再进行排序,当增量减到1的时候,整个要排序的数被分析一组,排序完成。
给一个完全无序的数列,然后运用希尔排序进行升序排序:
增量序列的取值依次为:5,3,1
如图:
代码:
void Shell(int *arr,int len,int dk) //传进来的dk是具体的增量值
{
int tmp=0;
for(int i=dk;i<len;i++)
{
tmp=arr[i];
int j=i-dk;
for(j;j>=0 && arr[j]>tmp;j-=dk)
{
arr[j+dk]=arr[j]; //仍然相当于直接插入,距离是增量距离而已
}
arr[j+dk]=tmp;
}
}
void ShellSort(int *arr,int len,int dk[],int dlen)// 加一个增量数组
{
int i=0;
for(i;i<dlen;i++) //当小于增量数组长度的时候,说明还没分组完,就一直循环
{
Shell(arr,len,dk[i]);
}
}