背景:快速排序算法又称为分区交换排序算法,该排序算法使用分割对排序文件中的记录进行排序。
思路如下:
从待排序记录中任选一个记录,以这个记录的排序码作为中心值,将其他所有记录划分成两个部分
- 第1部分包括所有排序码小于中心值的记录
- 第2部分包括所有排序码大于中心值的记录
- 其排序码作为中心值的这个记录,在排序后必然处在这两部分的中间位置
- 排序码等于中心值的被划归到第1部分还是第2部分是随便的,在这里我们划归到第1部分,这就导致了快速排序是不稳定的排序算法
对上述两部分继续采用同样的方法进行排序处理,直到每个部分为空或者只含有一个记录为止。至此,待排序文件中的每一个记录都被放到正确的排序位置。
--------参考文献 熊岳山,祝恩.数据结构与算法[M].北京:清华大学出版社,2013:109-113.
#include<stdio.h> #include<stdlib.h> #include<assert.h> #define MaxSize 100 typedef int ElemType; typedef struct forSort { ElemType key; }ForSort; typedef ForSort* pAr; int ReadTxtToArry(pAr par) { assert(par != NULL); int i = 0; FILE* fp; errno_t err = fopen_s(&fp, "sort.txt", "r"); if (err != 0) //打开文件失败 exit(1); while (!feof(fp)) { fscanf_s(fp, "%d", &par[i++]); } return i; } /***************************************************************** *函数名:QuickSort *函数功能描述:将记录按排序码非递减排序 *函数参数:par-记录数组,low-左边界,high-右边界 *函数返回值:无返回值 *作者:王赋睿小胖子 *函数创建日期:2018.6.17 *函数修改日期:尚未修改 *修改人:尚未修改 *修改原因:尚未修改 *版本:1.0 *历史版本:无 *****************************************************************/ void QuickSort(pAr par, int low, int high) { assert(par != NULL); int i, j; forSort temp; if (low >= high) return; //递归终止条件 i = low; j = high; temp = par[i]; while (i < j) { while (i < j&&temp.key < par[j].key)--j;//从后向前比较,直到当前记录的排序码小于等于中心值 if (i < j) par[i++] = par[j]; //将排序码小于等于中心值的记录交换到前面当前空出的记录位置 while (i < j&&par[i].key <= temp.key)++i;//从前向后进行比较,直到当前记录的排序码大于中心值 if (i < j) par[j--] = par[i]; //将排序码大于中心值的记录交换到后面当前空出的记录位置 } par[i] = temp; //找到中心值对应的记录所在的位置,写入中心值对应的记录 QuickSort(par, low, --j); //递归处理排序码小于等于中心值的那组记录 QuickSort(par, ++i, high); //递归处理排序码大于中心值的那组记录 } void PrintArry(pAr par, int n) { assert(par != NULL); assert(n > 0); for (int i = 0; i < n; ++i) { printf("%-4d", par[i]); } printf("\n"); } int main() { ForSort ar[MaxSize]; int n= ReadTxtToArry(ar); printf("快速排序前:"); PrintArry(ar, n); QuickSort(ar, 0, n - 1); printf("快速排序后:"); PrintArry(ar, n); return 0; }
本程序在VS2017下运行通过