下面代码拷贝这个人的博客
这篇博客写的很清楚,可以去参考看下
白话经典算法系列之六 快速排序 快速搞定:http://blog.csdn.net/morewindows/article/details/6684558
备注:以一个数为基准,将其他数比它小的放到左边,比它大的放到右边
在以这个数所在位置为边界(i - 1与 i + 1)
分别处理左部份和右部份(由于左半部分(子数组)与右半部分类(子数组)似于父数组,所以利用分治法(递归处理))
1. 排序效率:O(N*logN)
2. 每次左右遍历一遍 只是一个数的位置为调整正确,然后不在处理这个数,而是以这个数的位置为边界,切割成两个子部分分开处理,
这两个部分之间没有任何关系。
3. 处理中间的过程类似一个二叉树:
这个二叉树的节点数就是这个需要排序的数组的元素总数,层数为循环的次数(logN),每次循环操作的步骤数(N)
从而每次排好次序的元素数为2的i次方 i为层数序号(序号从0开始);
public class Sort {
// 快速排序
static void quick_sort(int s[], int l, int r) {
if (l < r) {
// s[(l + r) / 2]; 将中间的这个数和第一个数交换
int i = l, j = r, x = s[l]; //s[l]即s[i]就是第一个坑
while (i < j) {
while (i < j && s[j] >= x)
// 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j]; //i++从左往右下一次需要操作的数
while (i < j && s[i] < x)
// 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i]; //j--从右往左下一次需要操作的数
}
//退出时,i等于j。将x填到这个坑中。
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] s = new int[] { 45, 56, 78, 12, 45, 90, 1, 3 };
quick_sort(s, 0, 7);
/*
* foreach的语句格式: for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句;
* foreach循环只能用于读取,不能改变对应的值 }
*/
for (int i : s) {
System.out.println(i);
}
}
}
输出为:
1
3
12
45
45
56
78
90