C语言实战开发——三种让人恼火的排序

冒泡排序

原理:
冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。

下面以对 3 2 4 1 进行冒泡排序说明。

第一轮 排序过程
3 2 4 1 (最初)
2 3 4 2 (比较3和2,交换)
2 3 4 1 (比较3和4,不交换)
2 3 1 4 (比较4和1,交换)
第一轮结束,最大的数4已经在最后面,因此第二轮排序只需要对前面三个数进行再比较。

第二轮 排序过程
2 3 1 4 (第一轮排序结果)
2 3 1 4 (比较2和3,不交换)
2 1 3 4 (比较3和1,交换
第二轮结束,第二大的数已经排在倒数第二个位置,所以第三轮只需要比较前两个元素。

第三轮 排序过程
2 1 3 4 (第二轮排序结果)
1 2 3 4 (比较2和1,交换)
至此,排序结束。

下面直接上代码:

int main(){
    int num[10] = {3,0,1,8,7,2,5,4,9,6};
     
    for(int i = 1; i < 10; i++){//控制总共遍历次数
        //开始每一次遍历 找到一个最大的数沉底 
        for(int j = 0; j < 10-i; j++){
            //让j和j+1的值进行比较
            if(num[j] > num[j+1]){
                //交换j和j+1的值
                int temp = num[j];
                num[j] = num[j+1];
                num[j+1] = temp;                 
            } 
        } 
    }
    
    //输出 
    for(int i = 0; i < 10; i++){
        printf("%d ", num[i]);
    }
    
    return 0;
}

选择排序

原理:
选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置;然后,选出第二小的数,放在第二个位置;以此类推,直到所有的数从小到大排序。

在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换。

下面,以对 3 2 4 1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置。

第1轮 排序过程 (寻找第1小的数所在的位置)
3 2 4 1(最初, min_index=1)
3 2 4 1(3 > 2, 所以min_index=2)
3 2 4 1(2 < 4, 所以 min_index=2)
3 2 4 1(2 > 1, 所以 min_index=4, 这时候确定了第1小的数在位置4)
1 2 4 3 (第1轮结果,将3和1交换,也就是位置1和位置4交换)

第2轮 排序过程 (寻找第2小的数所在的位置)
1 2 4 3(第1轮结果, min_index=2,只需要从位置2开始寻找)
1 2 4 3(4 > 2, 所以min_index=2)
1 2 4 3(3 > 2, 所以 min_index=2)
1 2 4 3(第2轮结果,因为min_index位置刚好在第2个位置,无需交换)

第3轮 排序过程 (寻找第3小的数所在的位置)
1 2 4 3(第2轮结果, min_index=3,只需要从位置2开始寻找)
1 2 4 3(4 > 3, 所以min_index=4)
1 2 3 4(第3轮结果,将3和4交换,也就是位置4和位置3交换)

至此,排序完毕。

依旧话不多说直接上代码:

int main(){
    //选择排序
    int num[10] = {3,0,1,8,7,2,5,4,9,6};
    
    for(int i = 0; i < 10-1; i++){//控制次数 
        //取出i对应的数,默认是最小的数
        int temp = num[i];
         
        //从i后面开始查找当前最小的数 放到i的位置 
        for(int j = i+1; j < 10; j++){
            //让temp和i后面的每个数进行比较 
            //temp始终保存最小的那个数
            if(num[j] < temp){
                //交换
                int n = temp;
                temp = num[j];
                num[j] = n; 
            } 
        } 
        //当前的temp值是最小的,写入i对应的位置
        num[i] = temp; 
    }
    
    //输出
    for(int i = 0; i < 10; i++){
        printf("%d ", num[i]);
    } 
    return 0; 
}

插入排序

原理:
插入排序的基本思想是,将元素逐个添加到已经排序好的数组中去,同时要求,插入的元素必须在正确的位置,这样原来排序好的数组是仍然有序的。

在实际使用中,通常是排序整个无序数组,所以把这个无序数组分为两部分排序好的子数组和待插入的元素。第一轮时,将第一个元素作为排序好的子数组,插入第二个元素;第二轮,将前两个元素作为排序好的数组,插入第三个元素。以此类推,第i轮排序时,在前i个元素的子数组中插入第i+1个元素。直到所有元素都加入排序好数组。

下面,以对 3 2 4 1 进行选择排序说明插入过程,使用j记录元素需要插入的位置。排序目标是使数组从小到大排列。

第1轮
[ 3 ] [ 2 4 1 ] (最初状态,将第1个元素分为排序好的子数组,其余为待插入元素)
[ 3 ] [ 2 4 1 ] (由于3>2,所以待插入位置j=1)
[ 2 3 ] [ 4 1 ] (将2插入到位置j)

第2轮
[ 2 3 ] [ 4 1 ] (第1轮排序结果)
[ 2 3 ] [ 4 1 ] (由于2<4,所以先假定j=2)
[ 2 3 ] [ 4 1 ] (由于3<4,所以j=3)
[ 2 3 4 ] [ 1 ] (由于4刚好在位置3,无需插入)

第3轮
[ 2 3 4 ] [ 1 ] (第2轮排序结果)
[ 2 3 4 ] [ 1 ] (由于1<2,所以j=1)
[1 2 3 4 ] (将1插入位置j,待排序元素为空,排序结束)

还是直接代码伺候吧:

int main(){
    //插入排序
    int num[10] = {3,0,1,8,7,2,5,4,9,6};
    
    for(int i = 0; i < 10-1; i++){//控制次数 
        //判断i和i+1的大小
        if(num[i] > num[i+1]){
            //换位置
            int temp = num[i];
            num[i] = num[i+1];
            num[i+1] = temp;
            
            //让i对应的值和前面所有的值进行比较
            for (int j = i; j > 0; j--){
                //j和j-1进行比较
                if(num[j] > num[j-1]){
                    //当前这个位置就是这个数字的位置 
                    break;
                } else{
                    //j和j-1换位置
                    int temp = num[j];
                    num[j] = num[j-1];
                    num[j-1] = temp; 
                } 
            } 
        } 
    } 
    
    //输出
    for(int i = 0; i < 10; i++){
        printf("%d ", num[i]);
    } 
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,518评论 0 1
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,569评论 1 4
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,301评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,349评论 0 2
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 745评论 0 0

友情链接更多精彩内容