冒泡排序象一个气泡从河底往上冒的过程一样,每次排序都把最大的数据放到最后,具体的第一趟冒泡排序的过程为:比较第一个数据元素x[0]与第二个数据元素x[1]的大小,若x[0]<x[1],则交换两者的值,否则什么都不做;接着跟x[2],x[3]…比较,直到x[n-1]与下x[n-2]的比较。接着第二、三…趟冒泡排序,过程与上一趟相同,只不过只需比较到比上一趟前一个位置即可。
快速排序是冒泡排序的一种改进。每趟冒泡排序只是从小于该趟的最大值的一端进行比较,而快速排序每次任取一个枢纽元(可为最大值),然后从大于和小于该枢纽元两个方向进行比较。
具体的实现代码如下所示
(代码的注释过程有快速排序的具体做法)
#include<stdio.h>
//冒泡排序的函数定义
void Bubble(int x[], int n) {
int i, j;
for(i=1;i<=n-1;i++) //排序的次数
for (j = 1; j <= n - i; j++) {//进行一次冒泡排序
if (x[j] > x[j + 1]) {
x[0] = x[j + 1];
x[j + 1] = x[j];
x[j] = x[0];
}
else
break;
}
}
//以下为快速排序的相关函数的定义
int Partition(int x[], int low, int high) {//一趟快速排序的函数定义
x[0] = x[low];//选择子序列的第一个元素为枢纽元
while (low < high) {
while (low<high && x[0]<x[high])//从序号为high的位置往前找到第一个小于枢纽元的元素
high--;
x[low] = x[high];//比枢纽元小的元素换到低端
while (low<high && x[0]>x[low])//从序号为low的位置往后找到第一个大于枢纽元的元素
low++;
x[high] = x[low];//比枢纽元大的元素换到高端
}
x[low] = x[0];//插入枢纽元
return low;
}
void Quicksort(int x[], int low, int high) {//用递归的方法实现总的快速排序
if (low < high) {
int pivotloc = Partition(x, low, high);
Quicksort(x, low, pivotloc-1);//对低端进行快速排序
Quicksort(x, pivotloc+1, high);//对高端进行快速排序
}
}
//打印数据的函数
void show(int x[], int n) {
for (int i = 1; i <= n; i++)
printf("%d ", x[i]);
printf("\n");
}
int main() {
int a[6] = { 0,23,56,69,89,78 }, b[6] = { 0,79,56,66,88,99 };//序号为0存储单元可为任意数,这里为0,要排序的数据不包括序号为0的数据
printf("冒泡排序后的数据如下:\n");
Bubble(a, 5);
show(a, 5);
printf("快速排序后的数据如下:\n");
Quicksort(b,1,5);
show(b, 5);
return 0;
}
程序的运行结果如下:
来源:CSDN
作者:XY德
链接:https://blog.csdn.net/weixin_44335707/article/details/104358396