快速排序与冒泡排序的实现

徘徊边缘 提交于 2020-02-21 11:17:37

冒泡排序象一个气泡从河底往上冒的过程一样,每次排序都把最大的数据放到最后,具体的第一趟冒泡排序的过程为:比较第一个数据元素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;
}

程序的运行结果如下:
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!