数据结构-排序-快速排序

    xiaoxiao2022-07-07  170

    数据结构-排序-快速排序

    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 转载说明出处

    最新回复(0)