八大排序------插入排序(直接插入排序,希尔排序)

八大排序------插入排序(直接插入排序,希尔排序)

排序算法有内排序和外排序,一般就用内排序,外排序就不常用。
内排序(数据在内存上)
外排序(数据在磁盘上)
内排序又有八大排序

插入排序

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]);
 }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值