四大简单排序:插入排序,希尔排序,选择排序,冒泡排序

#include<stdio.h>

#define N 100

//插入排序法:

void insert(int *a,int n); 

//希尔排序

void gap(int *a,int n); 

void show(int *a,int n);

void swap(int *a,int *b);

//选择排序 

void choose(int *a,int n);

//冒泡排序 

void mao(int *a,int n); 

int main()

{

 int a[N],n;

 printf("How many numbers do you want to enter?\n");

 scanf("%d",&n);

 printf("input data:\n");

 for(int i=0;i<n;i++)

  scanf("%d",&a[i]);

// insert(a,n);

// gap(a,n);

 choose(a,n);

// mao(a,n);

 show(a,n);

}

void insert(int *a,int n)

{

 //从第一个元素开始,这个元素可以认为已经被排序

 //记录这个元素后面的元素,并把记录的这个视为要插入的

 //需要进行n-1-1次判断

 for(int i=0;i<n-1;i++)

 {

  int end=i;//标记有顺序的元素下标

  int tem=a[end+1];//记录最后有序的元素的下一位

  while(end>=0)//有序的数有至少一个 

  {

   if(tem<a[end])

   {

    a[end+1]=a[end];

    end--;

    //end--,end必须--,因为if,else两种情况下,交换不交换不一定 

    }

   else

    break;

   

   

   } 

  a[end+1]=tem;//end已经--了 

  //a[end];不能这样 

  } 

}

void show(int *a,int n)

{

 for(int i=0;i<n;i++)

 {

  printf("%d ",*(a+i));

 }

}

//希尔排序 

void gap(int *a,int n)

{

 int gap=n;

 while(gap>1)

 {

  gap=gap/2;

  

  for(int i=0;i<n-gap;i++)

  {

   int end=i;//记录有顺序的元素下标 

   int tem=a[end+gap];//记录要比较的数 

   while(end>=0)

   {

    

    if(tem<a[end])

    {

     a[end+gap]=a[end];

     end-=gap;

    }

    else

     break;

   }

   a[end+gap]=tem;

  }

 }

 

 

}

//选择排序

void choose(int *a,int n)

{

 int begin=0,end=n-1;

 while(begin<end)

 {

  int max=begin;

  int min=begin;

  //找出最值的下标 

  for(int i=begin;i<=end;++i)

  {

   if(a[i]>a[max])

    max=i;

   if(a[i]<a[min])

    min=i;

  }

  //最小值放到开头,和开头交换 

  swap(&a[min],&a[begin]);

  if(begin==max)

   max=min;

  //最大值放到末尾 

  swap(&a[max],&a[end]);

  ++begin;

  --end;

 }

 } 

 void swap(int *a,int *b)

 {

  int tem=*a;

  *a=*b;

  *b=tem;

 }

 //冒泡排序法

 void mao(int *a,int n)

 {

  int end=n;

  while(end)

  {

   int flag=0;

   for(int i=1;i<end;++i)

   {

    if(a[i-1]>a[i])

    {

     int tem=a[i];

     a[i]=a[i-1];

     a[i-1]=tem;

     flag=1;//两个交换了数值 

    }

   }

  if(flag==0)//本就是增序排列的 

    break;

  --end; 

  }

  } 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

try again!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值