关于C语言的冒泡排序和快速排序

冒泡排序:

冒泡排序一般来说进行的是n-1次排序(如果n个数需要排序),在每一次的排序中总会找到一个数在左边或者右边,如果设置一个flag 有的时候就可以大大减少排序的次数

代码如下:

#include<iostream>
using namespace std;
void BubbleSort(int a[6], int len) {
	int i, j, flag, t;
	for (i = 0; i < len - 1; i++) {
		flag = false;//设置标志位
		cout << endl;
		cout << "第" << i + 1 << "次" << endl;//判断几次排序
		for (j = len - 1; j > i; j--) {
			if (a[j - 1] > a[j]) {
				t = a[j - 1];
				a[j - 1] = a[j];//值的调换
				a[j] = t;
				flag = true;
			}
		}
		if (flag == false) {
			return; //判断标志位
		}
	}
}
void print(int a[6]) {
	for (int i = 0; i < 6; i++) {
		cout << a[i] << " ";
	}
}
int main() {
	int a[6] = { 1,3,5,6,4,80 };

	print(a);
	BubbleSort(a, 6);
	cout << "冒泡排序后为" << endl;
	print(a);
}

1.设置 len -1 次循环代表 n-1 次排序,设置j = n - 1 为初值,即要向下排序。

2.找到a[j] 和a[j-1]进行比较,如果a[j-1]>a[j]需要将两个值进行调换,在本代码中第一次内层循环过后找到了一个最小值

3.正常循环len-1 趟就可以冒泡排序完成。在代码中设置一个flag初始值为0,只有当在两个值调换过后,它的值变为1

4.在一次排序后面进行对flag的判断,如果flag的值没有变化说明此次排序中没有进行值的调换,即排序完成。

由图可知此次进行了两次排序:

快速排序:

快速排序有4个变量,相比于折半排序没有了mid这个变量。它用到了两个函数,其中一个函数相当于一次排序,另一个函数递归,来实现排序的目的。

 

#include<iostream>
using namespace std;


int floorSort(int a[6], int low, int high) {
	int blue = a[low]; //设置单次排序的基本值
	while (low < high) {  
		while (low<high && a[high]>=blue) { //如果high的值大于基本值的话就把high的下标向前移动
			high--;
		}
		a[low] = a[high];//如果不大于等于基本值的话就把low下标的值等于high下标的值,执行对low值的操作
		while (low < high && a[low] <= blue) {//low的值向前移动
			low++;
		}
		a[high] = a[low]; //如果low的值大于基本值就将现在high下标的值进行赋值
	}
	a[low] = blue; //分配完基本值的左右两边以后把 low下标赋值
	return low;//返回low下标
}
void QuickSort(int a[6], int low, int high) {
	
	if (low < high) {
		int basic = floorSort(a, low, high); //返回此次执行的 low 下标
		QuickSort(a, low, basic - 1); //递归调用,执行基本值左边的集合
		QuickSort(a, basic + 1, high);//递归调用,执行右边的集合
	}
}
void print(int a[6]) {
	for (int i = 0; i < 6; i++) {
		cout << a[i] << " ";
	}
}
int main() {
	int a[6] = { 1,3,5,6,4,80 };

	print(a);
	QuickSort(a,0,5);
	cout << "快速排序后为" << endl;
	print(a);
}

1. 设置单次排序的基本值,首先是从high为下标的数字开始和基本值进行判断如果大于基本值向前移动,否则将说明此值小于基本值,需要移动到前面的集合中

2.轮到low为下标的值和基本值进行判断,如果小于基本值向前移动,否则将说明此值大于基本值,需要移动到后面的集合中

3.直到low的值不小于high的值结束,并将low下标赋值,值为基本值。单次函数执行后返回的是low的值

4.在递归函数中,分别再次调用单次函数,函数执行的是上一次排序中得到的low值的左边(集合)和low值的右边(集合)。直到 low>=high 整个快速排序完成

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值