冒泡排序:
冒泡排序一般来说进行的是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 整个快速排序完成