个人博客地址:http://www.klshiguang.xyz/
package www.klshiguang.sort;
/**
* @author Felix Guo
* 基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
* 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
* 三个指针: 第一个指针称为pivotkey指针(枢轴),第二个指针和第三个指针分别为left指针和right指针,
* 分别指向最左边的值和最右边的值。left指针和right指针从两边同时向中间逼近,在逼近的过程中不停的与枢轴比较,
* 将比枢轴小的元素移到低端,将比枢轴大的元素移到高端,枢轴选定后永远不变,最终在中间,前小后大。
需要两个函数:
① 递归函数 public static void quickSort(int[]n ,int left,int right)
② 分割函数(一趟快速排序函数) public static int partition(int[]n ,int left,int right)
*/
public class QuickSort {
public int partition(int[] list, int left, int right) {
int tmp = list[left]; //数组的第一个作为中轴
while (left < right) {
while (left < right && list[right] > tmp) {
right--;
}
//将比枢轴小的元素移到低端,此时high位相当于空,等待低位比pivotkey大的数补上
list[left] = list[right]; //比中轴小的记录移到低端
while (left < right && list[left] <= tmp) {
left++;
}
list[right] = list[left]; //比中轴大的记录移到高端
}
//当low == high,完成一趟快速排序,此时low位相当于空,等待pivotkey补上
list[left] = tmp;
//中轴记录到尾
return left; //返回中轴的位置
}
public void quickSort(int[] list, int left, int right) {
if (left < right) {
int middle = partition(list, left, right); //将list数组进行一分为二
quickSort(list, left, middle - 1); //对低字表进行递归排序
quickSort(list, middle + 1, right); //对高字表进行递归排序
}
}
public void quick(int[] str) {
if (str.length > 0) { //查看数组是否为空
quickSort(str, 0, str.length - 1);
}
}
public static void main(String[] args) {
int[] list={1,3,5,7,9,7,14,15};
QuickSort qs=new QuickSort();
qs.quick(list);
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
参考:http://blog.youkuaiyun.com/wangkuifeng0118/article/details/7286332,http://blog.youkuaiyun.com/xuxurui007/article/details/7639863