排序(算法)

文章介绍了C语言中常用的几种排序算法,包括插入排序和希尔排序。插入排序是基础排序,而希尔排序是插入排序的优化,通过增量分组进行排序,提高了效率但不保证稳定性。文章提供了相应的C语言代码示例来展示这两种排序算法的工作原理和实现过程。
摘要由CSDN通过智能技术生成

C语言中有着多种排序方法,其中希尔排序便是之一。

希尔排序是什么?怎么写?希尔排序又称”缩小增量排序”,是插入排序的改进版本。

它会将待排序的记录按下标的一定增量分组,随着增量逐渐减少,每组包含关键词

越来越多当增量减至1时,整个文件被分成一组,算法便终止。希尔排序的效率要

高于插入排序算法,但是它是一种不稳定的排序算法。

1.插入排序:

#include<stdio.h>
int insort(int s[],int n)        /*自定义函数insort()
{ int i,j;
  for(i=2;i<=n;i++)              //数组下标从2开始,是[0]做监视哨,s[1]一个数据无可比性
   {s=[0]=s[i];                  //给监视哨赋值
    j=i-1;                      //确定要比较元素的最右边位
    while(s[0]<s[j])
      {s[j+1]=s[j];              //数据右移
       j--;                      //移向左边一个为比较的数
      }
    s[j+1]=s[0];                 //在确定的位置插入s[1]
   }
  return 0;
}
int main()
{int a[11],i;
printf("请输入10个数据\n");
for(i=1;i<=10;i++)
{
scanf("%d"&a[i]);
}
printf("原始顺序\n");
for(i=1;i<11;i++)
{
printf("%5d",a[i]);
}
insort(a,10);
printf("插入数据排序后顺序\n");
for(i=1;<11;i++)
{
printf("%5d",a[i]);
}
printf("\n");
return 0;
}

 运行结果:

请输入10个数值:

25 12 36 45 2 9 39 22 98 37

插入数据排序后顺序:

2 9 12 22 25 36 37 39 45 98

过程如下:

趟数      监视哨                           排序结果

1           25             (25 )12 36 45 2 9 39 22 98 37

2           12           (12 25 )36 45 2 9 39 22 98 37

3          36            (12 25 36 )45 2 9 39 22 98 37

4          45           (12 25 36 45 )2 9 39 22 98 37

5           2            (2 12 25 36 45 )9 39 22 98 37

6          9               (2 9 12 25 36 45 ) 39 22 98 37

7          39              (2 9 12 25 36 39 45 ) 22 98 37

8          22              (2 9 12 22 25 36 39 45 ) 98 37

9         98               (2 9 12 22 25 36 39 45  98 )37

10        37               (2 9 12 22 25 36 37 39 45 98)

算法中放置监视哨是为了避免数据在后面移动时丢失。

2.希尔排序:

​
#include<stdio.h>
int insort(int s[],int n)      /*自定义函数insort()
{ int i,j,d;
d=n/2;                         //确定固定值
while(d>=1)
 {
  for(i=d+1;i<=n;i++)          //数组下标从d+开始进行插入排序       
   {s=[0]=s[i];                //监视哨
    j=i-d;                    //确定要进行比较的元素最右边位置   
    while((j>0)&&(s[0]<s[j]))
      {s[j+d]=s[j];            //数据右移      
       j=j-d;                  //向左移d个位置  
      }
    s[j+d]=s[0];               //确定位置插入s[i]  
   }
 d=d/2;
 }
  return 0;
}
int main()
{int a[11],i;
printf("请输入10个数据\n");
for(i=1;i<=10;i++)
{
scanf("%d"&a[i]);
}
printf("原始顺序\n");
for(i=1;i<11;i++)
{
printf("%d",a[i]);
}
insort(a,10);
printf("插入数据排序后顺序\n");
for(i=1;<11;i++)
{
printf("%5d",a[i]);
}
printf("\n");
return 0;
}

​

技术要求:

希尔排序是自接插入排序的基础上改进,也就是将排序的序列按固定增量分成若干组,等距者在同二组中,然后再组内进行直接插入排序,这里面的固定增量n/2 ,以后每次缩小原来的一半。

3.选择排序

#include <stdio.h>
int main()
{    
   int i,j,t,a[11];           //定义变量及数组为基本整型    
   printf("请输入10个数:\n");    
   for(i=0;i<10;i++)          //从键盘中输入10个数        
   scanf("%d",&a[i]);    
   for( i=0;i<10;i++)         //变量i代表比较的趟数          
   {
     for(j=i+1;j<10;j++)      //变最j代表每趟两两比较的次数      
    {          
     if(a[i]>a[j])           
      {          
       int c=a[i];            //产利用中间变童实现两值互换
        a[i]=a[j];
           a[j]=c;            
       }        
     }
   }       
  for(int i = 0;i < 10;i++)    
  {       
  printf("%d ",a[i]);    
  }
 return 0;
}

 

 

4.冒泡排序

#include <stdio.h>
int main()
{
    int i,j,t,a[11];    

//定义变量及数组为基本整型
    printf("请输入10个数:\n");
    for(i=1;i<11;i++)
        scanf("%d",&a[i]);  

 //从键盘中输入10个数
    for(i=1;i<10;i++)    

//变量i代表比较的趟数
        for(j=1;j<11-i;j++)    

//变最j代表每趟两两比较的次数
            if(a[j]>a[j+1])
            {
                t=a[j];    

//产利用中间变童实现两值互换
                a[j]=a[j+1];
                a[j+1]=t;
            }
            printf("排序后的顺序是:\n");
            for(i=1;i<=10;i++)
                printf("%5d",a[i]);  

 //将胃泡排序后的顺序输出
        printf("\n");
    return 0;
}

 

 

如有错误还请指正,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值