数据结构之——快速排序
2016-10-28 22:29
211 查看
#include <stdio.h> #include <stdlib.h> #define true 1 #define false 0 typedef int bool; //输入一个数组,进行快速排序后输出 //快排子函数,输入参数为数组名和数组最小的下标和最大的下标 //快速排序的实现依赖于递归,该首先确定了某个元素在序列中的位置后,将原序列分为左右两个部分,然后按照先左,再右的顺序进行递归 void quick_sort(int * a, int low ,int high) { int pos = low; if(low < high) { pos = locate(a,low,high); quick_sort(a,low,pos-1); quick_sort(a,pos+1,high); } } //将 low 位置上的元素在数组中确定其定位,并返回位置序号 pos ;快排程序理解的难点一是递归,二是这个子函数 int locate(int* a,int low ,int high) { int val = a[low]; //定位此次递归中,最左侧元素 a[low] 的位置,并返回位置序号 pos while(low < high) { while(low < high && a[high] > val) //最右侧元素比 val 的值大时,high-- ,直到 a[high]不再大于 val 也就是说,此时的a[high]必须要换到a[low]了 high--; //再出现在这儿不合适了 a[low] = a[high]; while(low < high && a[low] < val) //最左侧的元素比 val 的值小时, low++ ,直到 a[low]不再小于 val ,也就是说,此时的a[low]应该出现在val 的右侧 low++; a[high] = a[low]; } a[low] = val; //当以上 while 循环结束后,必然有 low == high 此时的位置,即为 val 这个元素应该在的位置,并返回此位置 return low; //此位置返回后,又会将原序列分为左右两部分,然后按照先左边,再右边的顺序递归,并且每次递归了,都是确定其每个子序列最左侧元素的位置 } int main() { int num,i; char c; printf("请输入数组元素的个数 = \n"); scanf("%d",&num); int a[num]; printf("请输入数组元素,每个元素以逗号隔开\n"); for(i=0;i<num;i++) { if(scanf("%c",&c)==',') break; scanf("%d",&a[i]); } quick_sort(a,0,num-1); for(i=0;i<num;i++) { printf("%d ",a[i]); } return 0; }
相关文章推荐
- 数据结构与算法之一快速排序
- 数据结构之快速排序
- 数据结构——选择排序、插入排序、冒泡排序、快速排序
- [数据结构]快速排序
- 数据结构——快速排序
- 数据结构(Java 快速排序模拟)本代码重在学习数据结构思路,代码完整性欠缺,请见谅
- 【数据结构与算法】快速排序
- 数据结构与算法问题 快速排序
- 数据结构之快速排序
- [数据结构]快速排序
- 数据结构之排序2(快速排序及其优化)
- 数据结构 快速排序
- 数据结构:排序算法之交换排序(冒泡排序、快速排序)
- 数据结构与算法之--高级排序:shell排序和快速排序
- 【C#数据结构】快速排序
- 数据结构-快速排序
- [golang] 数据结构-快速排序
- 数据结构与算法——冒泡排序、选择排序和快速排序
- 数据结构实验之排序七:选课名单——快速排序
- [数据结构]栈的插入,归并以及快速排序