未完成的快排
来源:互联网 发布:java action类 编辑:程序博客网 时间:2024/04/28 22:09
快速排序
快排的核心就是分治递归技术,简而言之就是不断的把大问题划分为小问题,利用小问题的解可以得出大问题的解,小问题再继续划分小小问题…..直到可以直接求出或较为简单的求出小小小…问题的解,即此时找到了递归出口。把这个小小小…问题的解记录下来并提交回上级,那么上级小小小..问题的解也解决了,然后就不断地返回,直到最大级别的大问题,此时我们的问题就解决了。然后明白这个思想了,就来看看这种思想在快速排序中的运用,首先我们得到了一串数字a1,a2,a3…..a10。我们首先(习惯性)把a1作为关键数据然后先把它取出来(随便定义个变量,把a1赋予它):x = a1.这时候再在a1与结尾处分别设置一个浮动小标记。i,j(i=1,j=n)。此时就开始比较了(先从后面比较),1.a[j]比x小(之所以要比较小,因为我想让排好后的序列按从大到小排列)的话,就把它赋予a[i](可能有的朋友不明白为什么是直接赋予,疑惑a[i]处的值不就直接被抹盖了么,其实不然,i = 1时,x已记录了它的值,此时a[i]可看为无用空间,即使被掩盖也无所谓,如果被掩盖的话a[i]与a[j]处的值相同,a[j]就变为无用空间了,等待着找到的下个值来赋予它),然后j–,否则就直接执行j–(即a【j】小于a【i】) .好了,我们第一次的选择判断完了,此时在a[i]左边都是比a[i]小的值,在a[i]右边都是比a[i]大的值,此时或许有朋友问,可是此时左右都是无序数列啊,对,没错不过不急,我们继续重复此以上步骤,将左边,右边分别进行以上步骤,不断砍为两部分最后砍的一个序列只剩三个数,一次排序后就有序了(即有序后无法再递归下去)那么就可以向上返回了,(好似向上级报告,我们这一队列有序了),很多段都有序后向上级报告我们有序了,那么这许多段就组成了有序数列。此时,该数列就有序了
#include <stdio.h> int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quicksort(int left,int right) { int i,j,t,temp; if(left>right) return; temp=a[left]; //temp中存的就是基准数 i=left; j=right; while(i!=j) { //顺序很重要,要先从右边开始找 while(a[j]>=temp && i<j) j--; //再找右边的 while(a[i]<=temp && i<j) i++; //交换两个数在数组中的位置 if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //最终将基准数归位 a[left]=a[i]; a[i]=temp; quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 } int main() { int i,j,t; //读入数据 scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); quicksort(1,n); //快速排序调用 //输出排序后的结果 for(i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
- 未完成的快排
- 快排的疑惑?
- 实现的快排
- 陈泽泽的快排
- 快排的本质
- 快排的用法
- 快排的优化
- 快排的思考
- 单链表的快排
- 非递归的快排
- java 实现的快排
- 快排用法的介绍
- 自己写的快排
- 快排函数的调用
- 快排函数的运用
- lua的快排(QuickSort)
- 关于快排的笔记
- erlang 的快排递归
- 连续第九十二天
- Activity的启动模式
- 何以解忧,唯有暴富
- Leetcode 46. Permutations with C
- 谈谈java中的对象
- 未完成的快排
- 【Unity教程】简单的单例的使用
- 几种常见的软件开发模型
- 【poj3070】Fibonacci
- 连续第九十三天
- 跟着 Google 学测试自动化——浅谈 Telemetry 的测试框架设计
- 《STL源码剖析》:前闭后开区间表示法
- Apache2.2 + FastCGI + GSoap 搭建 WebService
- 上下元素margin重叠问题的解决办法(一种情况)