商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > C语言排序算法的几种实现过程

C语言排序算法的几种实现过程

  发布于2026-07-18 阅读(0)

扫一扫,手机访问

排序算法是C语言编程中的核心基础。掌握冒泡、选择、插入、快速这几种经典排序,基本就能应对大部分场景。下面逐一来看其实现思路与代码。

一、冒泡排序

思想:

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

总结

四种排序各有特点:冒泡直观但效率低,选择简单但不稳定,插入适合基本有序的数据,快速排序则是实际应用最广泛的经典算法。理解它们的思路和代码实现,对后续学习更复杂的算法大有裨益。

本文转载于:https://www.jb51.net/program/36230017n.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注