/**
* 快速排序
* 原理:
* 选择一个值作为基准(一般第一个元素)。比基准值小的都放在左边,大的都放在右边
* 一次循环:
* 从后向前比较,用基准值和最后一个值比较,如果比基准值小的和a[start]交换位置,
* 若不小于跳过继续。找到这个值后又从前往后开始比较,如果比基准值大,和a[end]交换位置,
* 如果不大于跳过。
* 这样一次排序下来比基准值小的都在左边,大的都在右边
*
*/
public class QucikSort {
public static void main(String[] args){
int a[] = {2,1,3,5,4,6};
sort(a,0,a.length - 1);
for(int i = 0;i < a.length - 1;i++){
System.out.println(a[i] + " ");
}
}
public static int[] sort(int a[],int low, int high){
int start = low;
int end = high;
int key = a[low];
while(end > start){
//从后往前比较,若没有比基准元素小的则继续往前走
while(end > start && a[end] >= key){
end --;
}
if(a[end] < key){
int temp = a[end];
a[end] = key;
a[start] = temp;
}
//从前往后执行若小于基准元素直接跳过
while(end > start && a[start] <= key){
start ++;
}
if(a[start] > key){
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
if(start > low){
sort(a,low,start - 1);
}
if(end < high){
sort(a,end+1,high);
}
return a;
}
}
package sort;
public class QuickSortReduce {
public static void main(String[] args) {
int[] a = {1, 2,2,3, 2, 5, 4, 8};
quickSort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void quickSort(int[] parm, int start, int end) {
if (start > end) {
return;
}
int i = start;
int j = end;
int povit = parm[start];
// 注意两个while不能调换
while (i < j) {
while (i < j && povit <= parm[j]) {
// 从右往左
j--;
}
while (i < j && povit >= parm[i]) {
// 从左往右
i++;
}
if (i < j) {
int temp = parm[j];
parm[j] = parm[i];
parm[i] = temp;
}
}
parm[start] = parm[i];
parm[i] = povit;
quickSort(parm, start, j - 1);
quickSort(parm, j + 1, end);
}
}