快速排序
2016-06-20 17:15
225 查看
快排是最快的算法之一,主要使用了分治策略。
图1 Quicksort(n)Quicksort(n)
步骤一具体做法,先选择一个元素 xx,所有小于 xx 的元素放到第一部分 bb 中,所有大于 xx 的元素放到第二部分 cc 中,等于 xx 的元素放到哪边都可以。下面的算法中,对于等于 xx 的元素,被放到任何一个部分都有可能。
输入:序列 a0,...,an−1a_0,...,a_{n-1}
输出:序列的一个置换,其中 a0,...,aja_0,...,a_j 小于等于 ai,...,an−1ai,...,a_{n-1} (i>ji>j)
算法:
注意这个版本的 partitionpartition 并不一定能把 xx 放到它的最终位置。因为元素xx也参与了交换。如果想得到 xx 的最终位置,算法如下。
版本二
输入:序列 a0,...,an−1a_0,...,a_{n-1}
输出:序列的一个置换和枢轴的位置,其中 a0,...,aj−1≤aj≤aj+1,...,an−1a_0,...,a_{j-1}\leq a_j \leq a_{j+1},...,a_{n-1}
算法:
版本二
这里给一个partitionpartition版本的代码
思路
第一步,将待排序序列 aa 分成两部分 bb 和 cc,其中 bb 部分的每个元素小于等于 cc 部分中的所有元素。第二步,递归的使用相同程序处理序列 bb 和 cc 。图1 Quicksort(n)Quicksort(n)
步骤一具体做法,先选择一个元素 xx,所有小于 xx 的元素放到第一部分 bb 中,所有大于 xx 的元素放到第二部分 cc 中,等于 xx 的元素放到哪边都可以。下面的算法中,对于等于 xx 的元素,被放到任何一个部分都有可能。
partitionpartition算法
版本一输入:序列 a0,...,an−1a_0,...,a_{n-1}
输出:序列的一个置换,其中 a0,...,aja_0,...,a_j 小于等于 ai,...,an−1ai,...,a_{n-1} (i>ji>j)
算法:
x=a[(n-1)/2] i = 0 and j = n-1 while i<=j: 搜寻第一个大于等于 x 的元素 a[i] 搜寻最后一个小于等于 x 的元素 a[j] if i<=j: exchange(a[i],a[j]) i=i+1 and j = j-1
注意这个版本的 partitionpartition 并不一定能把 xx 放到它的最终位置。因为元素xx也参与了交换。如果想得到 xx 的最终位置,算法如下。
版本二
输入:序列 a0,...,an−1a_0,...,a_{n-1}
输出:序列的一个置换和枢轴的位置,其中 a0,...,aj−1≤aj≤aj+1,...,an−1a_0,...,a_{j-1}\leq a_j \leq a_{j+1},...,a_{n-1}
算法:
x=a[0] i = 1 and j = n-1 while i<=j: 搜寻第一个大于等于 x 的元素 a[i] 搜寻最后一个小于等于 x 的元素 a[j] if i>=j: break exchange(a[i],a[j]) i=i+1 and j = j-1 exchange(a[0], a[j]) return j;
C语言代码
版本一:void exchange(int a[], int i, int j){ int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } void quickSort(int a[], int lo, int hi){ if(lo >= hi) return; int x = a[lo+(hi-lo)/2]; int i = lo, j = hi; // partition while(i <= j){ while(a[i] < x)++i; while(x < a[j])--j; if (i <= j){ exchange(a, i++, j--); } } // recursion quickSort(a, lo, j); quickSort(a, i, hi); }
版本二
这里给一个partitionpartition版本的代码
int partition(int a[], int lo, int hi){ int i = lo, j = hi + 1; int x = a[lo]; while(true){ while(a[++i] < x) if(i == hi) break; while(x < a[--j]) if(j == lo) break; if(i >= j) break; exchange(a, i, j); } exchange(a, lo, j); return j; } void quickSort(int a[], int lo, int hi){ if(lo <= hi) return; int j = partition(a, lo, hi); quickSort(a, lo, j - 1); quickSort(a, j + 1, hi); }
相关文章推荐
- 光学调焦和数字调焦
- C++学习体会
- [置顶] 拾色器,可以取出电脑屏幕的任何颜色,ui以及程序员前端等常用软件,文件很小,300K
- 旋转:矩阵,四元数和欧拉角向量(1)
- append a string to each line
- 创建案例
- StatsD的使用及Java和NodeJS客户端的调用
- summarytrees_htmlwidget
- Java并发编程:Callable、Future和FutureTask
- mybatis学习笔记
- JavaScript表单验证
- 文件阅读(1)
- maven+springMVC+mybatis+junit详细搭建过程
- Omnigraffle Pro 6 Axure RP Pro MAC注册码许可证
- Bootstrap 模态对话框只加载一次 remote 数据的解决办法
- Mybatis为实体类定义别名typeAliases
- 百度地图demo
- 注解注入annotation
- Ubuntu Server 14.04 x64安装Grafana
- samba 配置文件详解 及 权限设置