快速排序的算法思想可以参考王道数据结构的书,建议先看书或者通过B站学习相关课程了解算法思想后再看代码。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ElemType int
//定义数据结构
typedef struct {
ElemType len;
ElemType* elem;
}SSTable;
//初始化待排序数组数据
void ST_Init(SSTable& ST, ElemType len) {
ST.len = len;
ST.elem = (ElemType*)malloc(sizeof(ElemType) * ST.len);
srand(time(NULL));
//生成随机数,用来检测待排序算法是否正确
for (int i = 0; i < len; i++) {
ST.elem[i] = rand() % 100;
}
}
//进行划分
int Partition(ElemType a[], ElemType low, ElemType high) {
//取第一个元素作为基准值
ElemType pivot = a[low];
//从右边找一个比基准值小的元素进行交换
while (low < high) {
while (low<high && a[high] >= pivot) {
high--;
}
a[low] = a[high];
//从左边找一个比基准值大的元素进行交换
while (low<high && a[low] < pivot) {
low++;
}
a[high] = a[low];
}
//将基准值放在基准位
a[low] = pivot;
return low;
}
void QuickSort(ElemType a[], ElemType low, ElemType high) {
if (low < high) {
int pos = Partition(a, low, high);
//递归调用快速排序算法,以达到整体有序的效果
QuickSort(a, low, pos - 1);
QuickSort(a, pos + 1, high);
}
}
//打印
void print(SSTable ST) {
for (int i = 0; i < ST.len; i++)
{
printf("%d ", ST.elem[i]);
}
printf("\n");
}
int main() {
SSTable ST;
ST_Init(ST, 10);
print(ST);
QuickSort(ST.elem, 0, ST.len-1);
print(ST);
return 0;
}
每次生成随机数进行排序,当然读者可以自己输入待排序的数据或者将数据固定下来。
如果想最后的结果按照逆序输出,可以修改打印函数,或者对划分函数进行修改。我相信当你理解了快速排序的算法思想后,应该可以自己修改划分函数,达到逆序的效果!
还是把逆序排序的代码也给你吧!以下是修改划分函数的方法。其实很容易对比上述代码发现,就只是修改了大于号和小于号的位置而已,是不是超级简单。
int Partition(ElemType a[], ElemType low, ElemType high) {
//取第一个元素作为基准值
ElemType pivot = a[low];
//从右边找一个比基准值大的元素进行交换
while (low < high) {
while (low<high && a[high] <= pivot) {
high--;
}
a[low] = a[high];
//从左边找一个比基准值小的元素进行交换
while (low<high && a[low] > pivot) {
low++;
}
a[high] = a[low];
}
//将基准值放在基准位
a[low] = pivot;
return low;
}
修改打印函数实现逆序输出的方法:
void print(SSTable ST) {
for (int i = ST.len-1; i >=0; i--)
{
printf("%d ", ST.elem[i]);
}
printf("\n");
}
运行结果截图:
正序排序:
逆序排序:
如果内容对你有帮助,关注我,给我点个小小的赞吧!
若内容有误,请指正并多多包容,谢谢。