快速排序
来源:互联网 发布:人工智能 大学排名 编辑:程序博客网 时间:2024/05/01 08:27
重新复习一遍算法。
之前有个桶排序和冒泡排序。这两个都比较简单,就先从快排开始,有时间再看一遍。
先讲讲原理:
比如输入的数据是 5 6 2 4 9
先取第一个数5,称这一个是基准数 然后从最后找到第一个比5小的,假设这个下标用j表示。再从第一个数开始找到第一个比基准数大的,假设这个下标用i表示。分别是4和6讲这两个数交换,变成了 5 4 2 6 9。再继续找。(必须j先开始)j到2比基准数小,然后i到2时候和j相遇。表示查找结束,交换基准数和2。变成2 4 5 6 9。现在看起来顺序正好了,但是还不能停止。从5将左右两边分开。左边2 4 5继续再从第一个数开始比较,第一个数2为基准数,j从5开始,i 从2开始。最后还是2 4 5。然后比较之前没比较的右边,6 9 比较。比较6,j从9,i从6开始。j到6与i相遇停止 然后还是6 9.这样一个快速排序完成。代码如下
#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; printf("scanf:"); 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;}大家理解了代码之后。想想为什么要从右边开始而不是从左边开始。
然后再出个题目 这里快排是从小到大,如果从大到小排列呢?
其实就改一处就好了。。。与基准数的比较i大于基准数,j小于基准数。
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 如何反编译一个android程序二
- 掩模
- HDU 5878 I Count Two Three
- [容斥+莫比乌斯]bzoj2440_完全平方数
- 排序算法汇总
- 快速排序
- HTML表格简历
- 你知道Hello World程序的由来吗?
- 手把手教你做音乐播放器(五)音乐列表的存储(上)
- MFCC特征参数提取过程详解
- 2016 年最受欢迎的编程语言是什么?
- 欢迎使用CSDN-markdown编辑器
- [Contests]2016 ACM/ICPC Asia Regional Qingdao Online(1001/2/4/5/6)
- CCF-CSP认证知识要求