发布于2026-07-18 阅读(0)
扫一扫,手机访问
排序算法是C语言编程中的核心基础。掌握冒泡、选择、插入、快速这几种经典排序,基本就能应对大部分场景。下面逐一来看其实现思路与代码。
思想:

相邻的两个数逐一比较,如果顺序不对就交换。外层循环一共进行 n-1 轮,每轮内层循环如果从下标0开始向右比较,则一轮结束后会得到一个最大的数(沉到最末尾);如果内层循环从下标 n-1 开始向左比较,则每轮会得到一个最小的数(浮到最前面)。循环 n-1 轮,整个序列就有序了。
void bubblesort(int *a,int n){
int i,j;
for(i=0;ia[j+1]){
swap(&a[j],&a[j+1]);
}
}
}
}
//双向冒泡排序
void bidbubblesort(int *a,int n){
int i,j;
int left,right;
left=0;right=n-1;
while(lefta[i+1]){
swap(&a[i],&a[i+1]);
}
} //从左向右比较,会出现一个最大的数在最右边
right--;
for(i=right;i>left;i--){
if(a[i]
二、选择排序
思想:
每次进入外层循环,先假设当前 i 位置上的元素是最小(或最大)的,记录下这个下标 min_pos。内层循环从 i+1 开始遍历,与 a[min_pos] 比较,如果发现更小的值,就把 min_pos 更新为当前下标。内层循环结束后,min_pos 就是真正最小值的下标,此时将 a[i] 与 a[min_pos] 交换。i 递增,重复 n-1 次,就得到了 n-1 个最小值,排序完成。
void selectsort(int *a,int n){
int i,j,min_pos;
//每一次从新进入循环都要先设置最小值的下标min_pos是当前i的值
for(i=0;i
//逆向选择排序
void selectsort(int *a,int n){
int i,j,max_pos;
for(i=n-1;i>0;i--){ //每一次从新进入循环都要先设置最大值的下标max_pos是当前i的值
max_pos=i; //设置假设最大值下标
for(j=i-1;j>=0;j--){ //j从最大值下标的前一个开始,与最大值比较直到j=0
if(a[j]>a[max_pos]){
max_pos=j;
}
}
if(max_pos!=i){
swap(&a[max_pos],&a[i]);
}
}
}
//双向选择排序
void bidselectsort(int *a,int n){
int i,j;
int left,right;
int min_pos,max_pos;
left=0;
right=n-1;
while(left=left;i--){
if(a[i]>a[max_pos]){
max_pos=i;
}
}
if(max_pos!=right){
swap(&a[max_pos],&a[right]);
}
right--;
}
}
三、插入排序
思路:
核心是逐步扩大有序区间:从下标0到0天然有序,接着让0到1有序,然后0到2有序……直到0到 n-1 有序。外层循环从 i=1 开始,表示要处理0到i的有序区间。每次先把 a[i] 暂存到 temp 里,然后内层循环“往前看”——从 i-1 开始向前遍历,如果前面某个元素比 temp 小,说明位置正确,直接 break;如果比 temp 大,就把这个元素后移一位(a[j+1]=a[j]),给 temp 腾出位置。内层循环结束后,将 temp 插入到 j+1 的位置。
void insertsort(int *a,int n){
int temp;
int i,j;
for(i=1;i=0;j--){//往前看
if(a[j]
四、快速排序
思想:
挖坑填数 + 递归。先选一个基准数 std = a[0],定义左右下标 left、right,以及一个决策变量 moving 来决定移动哪个下标(1表示左下标,2表示右下标)。初始时 moving=2,表示先移动右下标——从右边找一个比 std 小的数,填到左边(因为 a[0] 被取出后就成了一个坑)。如果没找到,right-- 继续找;找到了,就把 a[right] 填入 a[left],然后 left++,并将 moving 改为1。接着移动左下标,从左边找一个比 std 大的数,填到右边。如此反复,直到 left == right,此时把 std 填入 a[left]。一轮结束后,基准数左边的元素都小于它,右边的都大于它。然后递归处理左右两个子区间。
void quicksort(int *a,int n)
{
if(n<2){//数组的元素少于两个就不用排序了
return;
}
//递归调用时,std、left,right都是相应的参数,这样写是没问题的
int std=a[0]; //选取数组第一个数作为中心轴 (基准数)
int left=0; //左下标
int right=n-1; //右下标
int moving=2; //判断当前应当移动哪个下标,1-左下标,2-右下标
while(left
总结
四种排序各有特点:冒泡直观但效率低,选择简单但不稳定,插入适合基本有序的数据,快速排序则是实际应用最广泛的经典算法。理解它们的思路和代码实现,对后续学习更复杂的算法大有裨益。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8