C语言一维数组排序问题(一)

1.起泡(冒泡)法排序

基本思路:每次将相邻两个数比较,将小的(大的)调到前边。如图:

在这里插入图片描述

第一趟后最大(最小)数 “沉底”,然后进行第二趟,第三趟。。。

如果有n个数,则要进行n-1趟比较,在第一趟中进行n-1次两两比较,在第j趟中进行n-j次两两比较。

代码实现:

#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<10-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个数:
66 32 23 45 25 5 15 69 46 37
排序后的顺序是:
    5   15   23   25   32   37   45   46   66   69

 

 

 

 2.选择排序

思路:选择排序的基本算法是从待排序的区间中经过选择和交换后选出最小的数值存放到 a[0] 中,再从剩余的未排序区间中经过选择和交换后选出最小的数值存放到 a[1] 中,a[1] 中的数字仅大于 a[0],依此类推,即可实现排序。

程序中用到两个 for 循环语句。第一个 for 循环是确定位置的,该位置是存放每次从待排序数列中经选择和交换后所选出的最小数。第二个 for 循环是实现将确定位置上的数与后面待排序区间中的数进行比较的。

#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<=9;i++)
        for (j=i+1;j<=10;j++)
            if(a[i]>a[j])    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    printf("排序后的顺序是:\n");
    for(i=1;i<=10;i++)
        printf("%5d", a[i]);    //输出排序后的数组
    printf("\n");
    return 0;
}

运行结果:

请输入10个数:
526 36 2 369 56 45 78 92 125 52
排序后的顺序是:
    2   36   45   52   56   78   92  125  369  526

 

 

3.快速排序

思路:快速排序是冒泡排序的一种改进,主要的算法思想是在待排序的 n 个数据中取第一个数据作为基准值,将所有记录分为 3 组,使第一组中各数据值均小于或等于基准值,第二组做基准值的数琚,第三组中各数据值均大于或等于基准值。这便实现了第一趟分割,然后再对第二组和第兰组分别重复上述方法,依次类推,直到每组中只有一个记录为止。

#include <stdio.h>
int qusort(int s[],int start,int end)    //自定义函数 qusort()快速排序
{
    int i,j;    
    i=start;    //将每组首个元素赋给i
    j = end;    //将每组末尾元素赋给j
    s[0]=s[start];    //设置基准值
    while(i<j)
    {
        while(i<j&&s[0]<s[j])
        j--;    //位置左移
        if(i<j)
        {
            s[i]=s[j];    //将s[j]放到s[i]的位置上
            i++;    //位置右移
        }
        while(i<j&&s[i]<=s[0])
            i++;    //位置左移
        if(i<j)
        {
            s[j]=s[i];    //将大于基准值的s[j]放到s[i]位置
            j--;    //位置左移
        }
    }
    s[i]=s[0];    //将基准值放入指定位置
    if (start<i)
        qusort(s,start,j-1);    //对分割出的部分递归调用qusort()函数
    if (i<end)
        qusort(s,j+1,end);
    return 0;
}
int main()
{
    int a[11], i;    //定义数组及变量为基本整型
    printf("请输入10个数:\n");
    for(i=1;i<=10;i++)
        scanf("%d",&a[i]);    //从键盘中输入10个要进行排序的数
    qusort(a,1,10);    //调用qusort()函数进行排序
    printf("排序后的顺序是:\n");
    for(i=1;i<=10;i++)
        printf("%5d",a[i]);    //输出排好序的数组
    printf("\n");
    return 0;
}

运行结果:

请输入10个数:
99 45 12 36 69 22 62 796 4 696
排序后的顺序是:
    4   12   22   36   45   62   69   99  696  796

 

4.插入法排序 

插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小。本实例要求使用直接插入排序法将数字由小到大进行排序。

原始顺序:25 12 36 45 2 9 39 27 98 37
 

表1 直接插入排序过程
趟数监视哨排序结果
125(12,)25,36,45,2,9,39,22,98,37
212(12,25,)36,45,2,9,39,22,98,37
336(12,25,36,)45,2,9,39,22,98,37
445(12,25,36,45,)2,9,39,22,98,37
52(2,12,25,36,45,)9,39,22,98,37
69(2,9,12,25,36,45,)39,22,98,37
739(2,9,12,25,36,39,45,)22,98,37
822(2,9,12,22,25,36,39,45,)98,37
998(2,9,12,22,25,36,39,45,98,)37
1037(2,9,12,22,25,36,37,39,45,98,)

本算法中使用了监视哨,主要是为了避免数据在后移时丢失

#include <stdio.h>
int insort(int s[], int n)    /* 自定义函数 insort()*/
{
    int i,j;
    for(i=2;i<=n;i++)    //数组下标从2开始,s[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[i]
    }
    return 0;
}
int main()
{
    int a[11],i;    //定义数组及变量为基木整型
    printf("请输入10个数据:\n");
    for (i =1;i<=10;i++)
        scanf("%d",&a[i]);    //接收从键盘输入的10个数据到数组a中
    printf("原始顺序:\n");
    for(i=1;i<11;i++)
        printf("%5d",a[i]);    //将未排序前的顺序输出
    insort(a,10);    //调用自定义函数 insort()
    printf("\n 插入数据排序后顺序:\n");
    for(i=1;i<11;i++)
        printf("%5d",a[i]); //将排序后的数组输出
    printf("\n");
    return 0;
}

 

运行结果:

请输入10个数据:
25 12 36 45 2 9 39 22 98 37
原始顺序:
   25   12   36   45    2    9   39   22   98   37
插入数据排序后顺序:
    2    9   12   22   25   36   37   39   45   98

 

附上相关链接https://blog.csdn.net/come_closer/article/details/89426570

 

  • 176
    点赞
  • 897
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值