快速排序(单边调换)
来源:互联网 发布:东方网络什么时候复牌 编辑:程序博客网 时间:2024/04/30 09:16
#include <stdio.h>#define MAXLEN100int a[MAXLEN];void swap(int a[] , int i , int j) {int tmp = a[i];a[i] = a[j];a[j] = tmp;}int split(int a[] , int left , int right) {//分离,将子序列按照左小右大的规则分离,中间为枢轴元素int piv , k;//pivot(枢轴)的下标,k为偏移计数量int one = a[left];//将子序列的首元素设为枢轴元素for ( piv = left , k = left + 1 ; k <= right ; k++ )if ( a[k] < one ) {//如果比枢轴小就和k同步增加,否则就将枢轴卡在大于等于枢轴的元素之前piv++;if ( k > piv )//如果k超前于枢轴(意味着k前面有元素把枢轴卡住了,所以要和枢轴元素交换一下swap(a , piv , k);}swap(a , left , piv);return piv;}void qsort(int a[] , int left , int right) {if ( left < right ) {int piv = split(a , left , right);qsort(a , left , piv - 1);//由于出现了下标的减法,为了避免1符号整型的0减1后变成大值,因此次算法不用size_t,下标一律用int表示qsort(a , piv + 1 , right);}}int main() {int len;scanf("%d" , &len);int i;for ( i = 0 ; i < len ; i++ )scanf("%d" , a + i);qsort(a , 0 , len - 1);for ( i = 0 ; i < len ; i++ )printf("%d " , a[i]);putchar('\n');return 0;}
测试数据(两组,执行两次):
5 input
5 4 3 2 1
1 2 3 4 5 output
7 input
3 45 12 34 5 44 8
3 6 8 12 34 44 45 output
- 快速排序(单边调换)
- 快速排序(双边调换)
- 快速排序--双边扫描与单边扫描的实现
- 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描
- Android之实现单边快速查找效果
- 【引用】单边桥图解(121法)
- 排序总结(快速排序)
- 排序(之快速排序)
- 快速排序(java排序)
- wikioi1076 排序(快速排序)
- 排序(5)快速排序
- c++排序(快速排序)
- 排序(二)快速排序
- 排序(3)--快速排序
- 排序(2)快速排序
- 排序(4)快速排序
- 快速排序-(交换排序)
- 快速排序(JavaScript)
- 番茄工作法到底对我们的时间管理起到了什么作用?
- 网速不稳定的原因与解决
- python 抽取信息
- hdu(1078) FatMouse and Cheese (记忆化搜索+dp)
- POJ1469:COURSES
- 快速排序(单边调换)
- 将一个Base64字符串转换成jpg图片的方法
- java内部类的作用
- 南阳-街区最短路径
- 线程的五大状态
- ping with ICMP
- fedora 18 下samba 4.0 配置 ( btrfs )
- Android入门之深入理解LinearLayout布局
- UVa - 123 - Searching Quickly