C语言算法----常用三大排序+交换排序(冒泡、选择、插入)

一、冒泡排序

从第一个数值开始,每相邻的两个数值排序与我们希望的排序位置不同时,将两个数的位置进行交换。如果一致,则不交换。每排一次会把最大或最小的数放到最后,重复上述操作,直到排序完成。

3,2,5,8,1,9,7,4,0,6
第一轮排序:2351874069
第二轮排序:2315740689
第三轮排序:2135406789
第四轮排序:1234056789
第五轮排序:1230456789
第六轮排序:1203456789
第七轮排序:1023456789
第八轮排序:0123456789
……

代码如下:

#include<stdio.h>
int main(){
  int a[10]={3,2,5,8,1,9,7,4,0,6};
  // 外层循环代表循环次数(n-1)
  for (int i = 0; i < 10-1; i++){
    // 内层循环代表个数(n-1-i)
    for (int j = 0; j < 10-1-i; j++){
      if(a[j]>a[j+1]){
        int t=a[j];
        a[j]=a[j+1];
        a[j+1]=t;
      }
    }
 }
// 打印结果
  for (int i = 0; i <= 9; i++) printf("%d",a[i]);
  return 0;
}

输出结果:0123456789

二、选择排序

从第一个数开始,控制变量法,第一个数依次与后面每一个数比较,当两个数与我们希望的排序位置不同时,做个标记与交换法的差距也就是在这里),第一轮循环完后将两个数的位置进行交换。全部比较完后最小的数到了最前面,继续从第二个数重复上述操作,直到排序完成。

代码如下:

#include<stdio.h>
int main(){
  int a[10]={3,2,5,8,1,9,7,4,0,6};
  int k;
  // 外层循环代表循环次数(n-1)
  for (int i = 0; i < 10-1; i++){
  //用k记录需要交换的值
      k=i;
    // 内层循环代表第j个与第i个比
    for (int j = i+1; j <= 10; j++){
      if(a[k]>a[j]){
        k=j;
      }
    }
    if (k!=i)
    {
        int t=a[k];
        a[k]=a[i];
        a[i]=t;
    }
 }
// 打印结果
  for (int i = 0; i <= 9; i++) printf("%d",a[i]);
  return 0;
}

输出结果:0123456789

三、插入排序

从第一个数开始,视为一个数组,将 i 与前面数组里的数从后往前依次比较,当两个数与我们希望的排序位置不同时,插入该数。

第一轮排序:3258197406
第二轮排序:2358197406
第三轮排序:2358197406
第四轮排序:2358197406
第五轮排序:1235897406
第六轮排序:1235897406
第七轮排序:1235789406
第八轮排序:1234578906
第九轮排序:0123457896
第十轮排序:0123456789
……

#include<stdio.h>
int main(){
  int a[10]={3,2,5,8,1,9,7,4,0,6};
  // 循环数组a
  for (int i = 0; i < 10; i++){
    // 循环前面的被插入数组
    for (int j = i; j > 0; j--){
      if (a[j] < a[j - 1])
      {
        int t = a[j];
        a[j] = a[j - 1];
        a[j - 1] = t;
      }
    }
  }
// 打印结果
  for (int i = 0; i <= 9; i++) printf("%d",a[i]);
  return 0;
}

输出结果:0123456789

四、交换排序

从第一个数开始,控制变量法,第一个数依次与后面每一个数比较,当两个数与我们希望的排序位置不同时,将两个数的位置进行交换。全部比较完后最小的数到了最前面,继续从第二个数重复上述操作,直到排序完成。

第一轮排序:0358297416
第二轮排序:0158397426
第三轮排序:0128597436
第四轮排序:0123897546
第五轮排序:0123498756
第六轮排序:0123459876
第七轮排序:0123456987
第八轮排序:0123456798
第九轮排序:0123456789
……

代码如下:

#include<stdio.h>
int main(){
  int a[10]={3,2,5,8,1,9,7,4,0,6};
  // 外层循环代表循环次数(n-1)
  for (int i = 0; i < 10-1; i++){
    // 内层循环代表第j个与第i个比
    for (int j = i+1; j <= 10; j++){
      if(a[i]>a[j]){
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
      }
    }
 }
// 打印结果
  for (int i = 0; i <= 9; i++) printf("%d",a[i]);
  return 0;
}

输出结果:0123456789

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

又又爱拍照

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

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

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

打赏作者

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

抵扣说明:

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

余额充值