快速排序
2014-04-28 11:23
330 查看
快排也是用到了分治法的思想,对一个子数组A[p...r]排序的分治过程为三个步骤:
1.分解:
A[p..r]被划分为俩个(可能空)的子数组A[p ..q-1]和A[q+1 ..r],使得
A[p ..q-1] <= A[q] <= A[q+1 ..r]
2.解决:通过递归调用快速排序,对子数组A[p ..q-1]和A[q+1 ..r]排序。
3.合并。
java实现:
public int[] quickSort(int[] arrays) {
if (null == arrays || arrays.length == 0) {
return arrays;
}
quickSort(arrays, 0, arrays.length -1);
return arrays;
}
public void quickSort(int[] arrays, int begin, int end) {
if (begin == end) {
return;
}
if (begin < end) {
int mid = partition(arrays, begin, end);
quickSort(arrays, begin, mid - 1);
quickSort(arrays, mid + 1, end);
}
}
/**
*
* PARTITION(arrays, begin, end)
* 1.key ← arrays[end]
* 2. i ← begin - 1
* 3. for j ← begin to end - 1
* 4. do if
* arrays[j] ≤ key
* 5. then i ← i + 1
* 6. exchange arrays[i] <-> arrays[j]
* 7. exchange arrays[i + 1]<-> arrays[end]
* 8. return i + 1
*/
private int partition(int[] arrays, int begin, int end) {
int key = arrays[end];
int i = begin - 1;
for(int j = begin; j < end; j++){
if(arrays[j] < key ) {
i++;
swap(arrays,i,j);
}
}
swap(arrays,i+1,end);
return i+1;
}
private void swap(int[] arrays, int i, int j) {
int tmp = arrays[j];
arrays[j] = arrays[i];
arrays[i] = tmp;
}
public static void main(String[] args) {
int[] arrays = { 10, 5, 4, 8, 74, 58, 12, 14, 14, 56, 3, 1, 11, 57, 41,
102, 13,256 };
arrays = new QuickSort().quickSort(arrays);
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]);
System.out.print(",");
}
}
}
1.分解:
A[p..r]被划分为俩个(可能空)的子数组A[p ..q-1]和A[q+1 ..r],使得
A[p ..q-1] <= A[q] <= A[q+1 ..r]
2.解决:通过递归调用快速排序,对子数组A[p ..q-1]和A[q+1 ..r]排序。
3.合并。
java实现:
public int[] quickSort(int[] arrays) {
if (null == arrays || arrays.length == 0) {
return arrays;
}
quickSort(arrays, 0, arrays.length -1);
return arrays;
}
public void quickSort(int[] arrays, int begin, int end) {
if (begin == end) {
return;
}
if (begin < end) {
int mid = partition(arrays, begin, end);
quickSort(arrays, begin, mid - 1);
quickSort(arrays, mid + 1, end);
}
}
/**
*
* PARTITION(arrays, begin, end)
* 1.key ← arrays[end]
* 2. i ← begin - 1
* 3. for j ← begin to end - 1
* 4. do if
* arrays[j] ≤ key
* 5. then i ← i + 1
* 6. exchange arrays[i] <-> arrays[j]
* 7. exchange arrays[i + 1]<-> arrays[end]
* 8. return i + 1
*/
private int partition(int[] arrays, int begin, int end) {
int key = arrays[end];
int i = begin - 1;
for(int j = begin; j < end; j++){
if(arrays[j] < key ) {
i++;
swap(arrays,i,j);
}
}
swap(arrays,i+1,end);
return i+1;
}
private void swap(int[] arrays, int i, int j) {
int tmp = arrays[j];
arrays[j] = arrays[i];
arrays[i] = tmp;
}
public static void main(String[] args) {
int[] arrays = { 10, 5, 4, 8, 74, 58, 12, 14, 14, 56, 3, 1, 11, 57, 41,
102, 13,256 };
arrays = new QuickSort().quickSort(arrays);
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]);
System.out.print(",");
}
}
}
相关文章推荐
- awk使用
- 通过rdesktop实现Linux和Windows操作系统远程互访
- 第一个只出现一次的字符(剑指offer35)
- Spring2.5 注解实例
- vim下接下Ctrl+S造成程序僵死
- Marvell78100的flash烧写流程
- mysql索引
- Java 项目字符集修改
- .pyc文件是什么?
- 使用Eclipse自带的Axis1插件生成WSDL文件
- IIS7.5 运行.net4.0准备工作
- .pyc文件是什么?
- Eclipse+Axis自动生成Web Service WSDL文件
- Effective STL:30 - 37 算法
- SP2010开发和VS2010专家"食谱"--第五章节—Web部件(3)--创建启用AJAX的Web部件
- SP2010开发和VS2010专家"食谱"--第五章节—Web部件(2)--创建纯代码部件(沙盒解决方案)
- Hibernate的HQL支持数据库convert函数
- 分享用Asp.net做的几个实例,数据报表、二维码、数据抓取、批量上传图片
- 使用 Socket 通信实现 FTP 客户端程序
- 带复选框的JTable