C语⾔对数组元素进⾏排序(冒泡排序法)
在实际开发中,有很多场景需要我们将数组元素按照从⼤到⼩(或者从⼩到⼤)的顺序排列,这样在查阅数据时会更加直观,例如:⼀个保存了班级学号的数组,排序后更容易分区好学⽣和坏学⽣;
⼀个保存了商品单价的数组,排序后更容易看出它们的性价⽐。
对数组元素进⾏排序的⽅法有很多种,⽐如冒泡排序、归并排序、选择排序、插⼊排序、快速排序等,其中最经典最需要掌握的是「冒泡排序」。
以从⼩到⼤排序为例,冒泡排序的整体思想是这样的:
从数组头部开始,不断⽐较相邻的两个元素的⼤⼩,让较⼤的元素逐渐往后移动(交换两个元素的值),直到数组的末尾。经过第⼀轮的⽐较,就可以到最⼤的元素,并将它移动到最后⼀个位置。
第⼀轮结束后,继续第⼆轮。仍然从数组头部开始⽐较,让较⼤的元素逐渐往后移动,直到数组的倒数第⼆个元素为⽌。经过第⼆轮的⽐较,就可以到次⼤的元素,并将它放到倒数第⼆个位置。
以此类推,进⾏ n-1(n 为数组长度)轮“冒泡”后,就可以将所有的元素都排列好。
整个排序过程就好像⽓泡不断从⽔⾥冒出来,最⼤的先出来,次⼤的第⼆出来,最⼩的最后出来,所以将这种排序⽅式称为冒泡排序(Bubble Sort)。
下⾯我们以“3  2  4  1”为例对冒泡排序进⾏说明。
第⼀轮  排序过程
3  2
4  1    (最初)
2  3  4  1    (⽐较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,交换)
第⼆轮结束,次⼤的数字 3 已经排在倒数第⼆个位置,所以第三轮只需要⽐较前两个元素。
第三轮  排序过程
2  1
3
4  (第⼆轮排序结果)
1  2  3  4  (⽐较2和1,交换)
⾄此,排序结束。
算法总结及实现
对拥有 n 个元素的数组 R[n] 进⾏ n-1 轮⽐较。
第⼀轮,逐个⽐较 (R[1], R[2]),  (R[2], R[3]),  (R[3], R[4]),  …….  (R[N-1], R[N]),最⼤的元素被移动到 R[n] 上。
第⼆轮,逐个⽐较 (R[1], R[2]),  (R[2], R[3]),  (R[3], R[4]),  …….  (R[N-2], R[N-1]),次⼤的元素被移动到 R[n-1] 上。
。。。。。。
以此类推,直到整个数组从⼩到⼤排序。
具体的代码实现如下所⽰:
#include <stdio.h>
int main(){
int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
int i, j, temp;
//冒泡排序算法:进⾏ n-1 轮⽐较
for(i=0; i<10-1; i++){
//每⼀轮⽐较前 n-1-i 个,也就是说,已经排序好的最后 i 个不⽤⽐较        for(j=0; j<10-1-i; j++){
if(nums[j] > nums[j+1]){
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
/
/输出排序后的数组
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf("\n");
c语言的冒泡排序算法return 0;
}
运⾏结果:
1 2 3 4 5 6 7 8 9 10

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。