数据结构-排序-快速排序
1.算法思想
- 快速排序的思想: 从n个记录中选取一个记录(这里选取第一个记录),使得排序码小于它的记录全都放在它的左边,大于它的都放在右边,然后对它的左右两边重复这个过程,直到所有记录都位于正确的位置。
- 具体做法: 先将第一个记录(记录记为 x )暂存,这样子就空出了第一个位置,这个位置将要放置排序码不大于x的记录,从右到左找到一个排序码不大于x的记录,将它放在第一个位置;然后后面就又有一个空位,我们要放入一个排序码大于x的记录,从左到右找到一个排序码大于的记录,放入后面的空白的位置,循环这个过程,直到两边的下标指向同一个位置时,就将x记录放入这个位置,完成划分,实现x的左边都是小于它的记录,右边都是大于它的记录。
- 图片来自与菜鸟教程
2.算法复杂度
- 执行时间: O(nlogn)
- 附加空间: 一个中点储存空间和要考虑递归的空间
- 是否是稳定的排序方法: 不稳定
3.算法实现
#include "stdio.h"
#define MAXSIZE 10
typedef int keytype;
typedef struct {
keytype key;
int other;
}recordtype;
typedef struct {
int length;
recordtype r[MAXSIZE + 1];
}table;
void quicksort(table * tab, int left, int right) {
int i, j;
i = left;
j = right;
if (left<right)
{
tab->r[0] = tab->r[i];
do {
//从右到左找到第一个排序码比参考记录小的记录,这里取最左边的记录作为参考值
while (tab->r[0].key < tab->r[j].key&&i < j) j--;
tab->r[i] = tab->r[j]; //找到这个记录并填充到前面空白的位置上
//从左到右找到第一个排序码大于参考记录的记录
while (tab->r[0].key > tab->r[i].key&&i < j) i++;
tab->r[j] = tab->r[i];//找到这个记录,并填充到后面的空白位置上
} while (i != j);
tab->r[i] = tab->r[0];
quicksort(tab, left, i - 1);
quicksort(tab, i + 1, right);
}
}
void inputData(table * tab) {
printf("please input the length:\n");
scanf("%d", &tab->length);
printf("please input the data:");
for (int i = 1; i <= tab->length; i++)
{
scanf("%d", &tab->r[i].key);
}
return tab;
}
void show(table * tab) {
printf("the result data:");
for (int i = 1; i <= tab->length; i++)
{
printf("%d ", tab->r[i].key);
}
}
void main() {
table * tab = malloc(sizeof(table));
inputData(tab);
quicksort(tab, 1, tab->length);
show(tab);
}
运行截图
欢迎大家关注我的博客:breeziness123
转载说明出处