八大排序------插入排序(直接插入排序,希尔排序)
排序算法有内排序和外排序,一般就用内排序,外排序就不常用。
内排序(数据在内存上)
外排序(数据在磁盘上)
内排序又有八大排序
插入排序
1.直接插入排序
2.shell(希尔)排序
选择排序
3.简单选择排序
4.堆排序
交换排序
5.冒泡排序
6.快速排序
归并排序
7.归并排序
基数排序
8.基数排序(桶排序)
这次就先说说插入排序,插入排序是拿到一个数据,将该数据插入合适的位置
1.直接插入排序
拿到数据,分为已排序部分和未排序部分,那刚拿到数据第一个肯定是已排序部分后面的就是未排序部分
i 标识未排序部分的起始
j 标识已排序部分的末尾
然后在用未排序部分的起始和已排序部分的尾部开始比较,这里给一个中间变量tmp存i的数值,如果末尾的值大于起始的值,则末尾的值往后移动一格,tmp继续向前比较,如果tmp的值小于末尾的值,则此位置就是要插入的位置。
#include<stdio.h>
void InsertSort(int arr[],int len)
{
int i=1;
int j=i-1;
int tmp;
for(i;i<len;i++)
{
tmp=arr[i];
for(j=i-1;j>=0&&arr[j]>tmp;j--)
{
arr[j+i]=arr[j];
}
arr[j+1]=tmp;
}
}
void Show(int arr[],int len)
{
int i=0;
for(i;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[]={12,3,21,32,1,34,12,35,34,18};
int len=sizeof(arr)/sizeof(arr[0]);
Show(arr,len);
InsertSort(arr,len);
Show(arr,len);
return 0;
}
2.希尔排序
也叫缩减增量排序,就是先按增量划分为小组,组内进行排序,缩减增量,然后整体趋于有序。
增量就是你想把他分成几组,但增量必须是质数且最后一个增量为1.
void Shell(int arr[],int len,int dk)
{
int i;
int j;
int tmp;
for(i=dk;i<len;i++)
{
tmp=arr[i];
for(j=i-dk; j>=0 && arr[j]>tmp; j-=dk)
{
arr[j+dk]=arr[j];
}
arr[j+dk]=tmp;
}
}
void ShellSort(int arr[],int len)
{
int dk[]={5,3,1};
int len1=sizeof(dk)/sizeof(dk[0]);
int i=0;
for(i;i<len1;i++)
{
Shell(arr,len,dk[i]);
}
}