2021-10-04

**

【数据结构上机实验记录】快速排序

这里有64个无序的数:
49, 38, 65, 97,
76, 13, 27, 49,
23, 89, 1, 90,
22, 980, 34, -2,
-10, 23, -24, 789,
1200, 18000, 7, 9,
23, 89, 0, -50,
38, 198, 53, 1,
812, 4, 5, 5,
6, 54, 364, 6,
46, 43, 6, 3485,
64, 57, 7, 9,
7, 1, 19, 4198,
198, 156, 41, 981,
9, 64, 89, 652,
289, 4, 655, 6
现通过快速排序算法,将它们按从小到大的顺序排列并输出,C语言代码如下:
**

#define LENGTH 64

#include<stdio.h>

int Partition(int* Array, int low, int high); //划分算法

void QuickSort(int* Arr, int Low, int High); //递归实现快速排序

int main(void) {

	int arr[LENGTH] = {
		49, 38, 65, 97, 76, 13, 27, 49,
		23, 89, 1, 90, 22, 980, 34, -2,
		-10, 23, -24, 789, 1200, 18000, 7, 9,
		23, 89, 0, -50, 38, 198, 53, 1,
		812, 4, 5, 5, 6, 54, 364, 6,
		46, 43, 6, 3485, 64, 57, 7, 9,
		7, 1, 19, 4198, 198, 156, 41, 981, 
		9, 64, 89, 652, 289, 4, 655, 6
	}; //定义对其进行快速排序的数组
	printf("Before:\n");
	for (int count = 0; count < LENGTH; count++) {
		printf("%-8d", *(arr+count)); //各个数对齐输出

		if (!((count+1) % 5)) {
			putchar('\n');
		} //每五个数换个行

	} //输出数组元素原先的序列

	QuickSort(arr,0, LENGTH-1); //快速排序

	printf("\n\nAfter:\n");
	for (int counter = 0; counter < LENGTH; counter++) {
		printf("%-8d", *(arr + counter)); //各个数对齐输出

		if (!((counter+1) % 5)) {
			putchar('\n');
		} //每五个数换个行
	} //输出数组元素快速排序后的序列

	putchar('\n');

	return 0;
}

int Partition(int* Array, int low, int high) {
	int pivot = Array[low]; //单独将被作为枢轴(基准)的元素提出来

	while (low < high) {
		while (low < high && Array[high] >= pivot) {
			high--;
		} //high指针一直移到右边第一个小于枢轴pivot的元素

		Array[low] = Array[high]; //小于枢轴的元素移到左边

		while (low < high && Array[low] <= pivot) {
			low++;
		} //low指针一直移到左边第一个大于枢轴pivot的元素

		Array[high] = Array[low]; //大于枢轴的元素移到右边
	}
	Array[low] = pivot; //将枢轴的值填入最后的空白
	
	return low;
}//划分算法

void QuickSort(int* Arr, int Low, int High) {
	int pivotpos = Partition(Arr, Low, High); //第一次划分得到的分界点
	if (pivotpos > Low) {
		QuickSort(Arr, Low, pivotpos-1); //对左边序列继续划分
	}
	if (pivotpos < High) {
		QuickSort(Arr, pivotpos+1, High); //对右边序列继续划分
	}
	//此处必须加条件,不然程序运行中将会一直执行函数调用语句QuickSort(Arr, Low, pivotpos-1);直到栈溢出

}//递归实现快速排序



程序执行结果如下:
2021-10-04

上一篇:1. 两数之和


下一篇:旋转数组的最小数字