**
【数据结构上机实验记录】快速排序
这里有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);直到栈溢出
}//递归实现快速排序
程序执行结果如下: