#include <stdio.h> #define MAXL 10

typedef int KeyType; typedef int InfoType;

typedef struct { KeyType key; //KeyType为关键字的数据类型 InfoType otherdata; // InfoType为其他数据类型 } RecordType ;

void PrintList(RecordType r[], int n) //打印顺序表元素 { for (int i = 0; i < n; i++) { printf("%d ", r[i].key); } printf("\n"); }

int QKPass(RecordType r[], int low, int high) //一趟快速排序算法的实现

{ RecordType tmp; tmp = r[low]; /* 选择首记录为基准记录 / while (low < high) /待排序区域长度大于1继续执行/ { /先从high向前扫描找小于tmp支点关键字的记录 / while(low < high && r[high].key >= tmp.key) high--; if (low < high)/找到小于tmp.key记录则放置到低半区/ {
r[low] = r[high]; /high指向的位置空了/ low++; }
while (low < high && r[low].key < tmp.key) /
其次从low向后扫描找大于tmp.key的记录 / low++; if (low < high) / 找到大于tmp.key的记录放置到高半区
/ { r[high] = r[low]; high--; }
} r[low] = tmp; /
将支点保存到low=high的位置 / return low; / 返回支点的位置 */ }

void QKSort(RecordType r[], int low, int high) //快速排序 { int pos; if (low < high) { pos = QKPass(r, low, high); QKSort(r, low, pos - 1); QKSort(r, pos + 1, high); } }

int main() { RecordType arr[MAXL] = {{4, 0}, {3, 0}, {6, 0}, {1, 0}, {9, 0}, {7, 0}, {5, 0}, {8, 0}, {2, 0}, {0, 0}}; int delta[3] = {5, 3, 1}; printf("快速排序前为: "); PrintList(arr, MAXL); QKSort(arr, 0, MAXL - 1); printf("快速排序后为: "); PrintList(arr, MAXL); return 0; }

输出结果为:

快速排序前为: 4 3 6 1 9 7 5 8 2 0 快速排序后为: 0 1 2 3 4 5 6 7 8 9

快速排序的具体过程为:

第一趟:

基准元素为4,low=0,high=9

从high向前扫描找小于4的元素,找到2,将其放到低半区,此时high=8

从low向后扫描找大于4的元素,找到9,将其放到高半区,此时low=1

从high向前扫描找小于4的元素,找到3,将其放到低半区,此时high=7

从low向后扫描找大于4的元素,找到6,将其放到高半区,此时low=2

从high向前扫描找小于4的元素,没有找到,结束第一趟排序,将基准元素4放到位置low=3,此时数组变为{2, 3, 0, 1, 4, 7, 5, 8, 6, 9}

第二趟:

基准元素为2,low=0,high=2

从high向前扫描找小于2的元素,没有找到

从low向后扫描找大于2的元素,找到3,将其放到高半区,此时low=1

从high向前扫描找小于2的元素,没有找到,结束第二趟排序,将基准元素2放到位置low=0,此时数组变为{0, 2, 3, 1, 4, 7, 5, 8, 6, 9}

第三趟:

基准元素为3,low=1,high=2

从high向前扫描找小于3的元素,没有找到

从low向后扫描找大于3的元素,没有找到,结束第三趟排序,将基准元素3放到位置low=2,此时数组变为{0, 2, 3, 1, 4, 7, 5, 8, 6, 9}

第四趟:

基准元素为1,low=3,high=2,结束排序

第五趟:

基准元素为4,low=4,high=9

从high向前扫描找小于4的元素,没有找到,结束排序

第六趟:

基准元素为7,low=5,high=9

从high向前扫描找小于7的元素,找到6,将其放到低半区,此时high=8

从low向后扫描找大于7的元素,没有找到,结束第六趟排序,将基准元素7放到位置low=6,此时数组变为{0, 2, 3, 1, 4, 6, 5, 7, 8, 9}

第七趟:

基准元素为5,low=7,high=9

从high向前扫描找小于5的元素,没有找到

从low向后扫描找大于5的元素,没有找到,结束第七趟排序,将基准元素5放到位置low=7,此时数组变为{0, 2, 3, 1, 4, 6, 5, 7, 8, 9}

第八趟:

基准元素为8,low=8,high=9,结束排序

第九趟:

基准元素为6,low=5,high=7

从high向前扫描找小于6的元素,没有找到

从low向后扫描找大于6的元素,没有找到,结束第九趟排序,将基准元素6放到位置low=5,此时数组变为{0, 2, 3, 1, 4, 5, 6, 7, 8, 9}

第十趟:

基准元素为9,low=8,high=9,结束排序

最终数组排好序为{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。

C语言快速排序算法详解与实现

原文地址: https://www.cveoy.top/t/topic/n45H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录