package link.排序;/*
*@author:
*@time
*/
import java.util.Arrays;
public class QuickSort {
/**
* 從第一個數開始作標記數,依次從最後向前比較,如果第一個數比後面的大時,
* 互換位置,如果第一個數換到後面,則遍歷從第二個數開始往後
* 遍歷過程中有比後面一個大的,互換位置,然後從標記數換過來的位置-1向前遍歷,直到下標相同
* 一輪結束後,標記數爲點,該點前面的一定比該數小,後面的一定比該數大
* 然後按標記數的位置將數組分爲兩部分,繼續上面的排序,
*
* @param arr
*/
public static void quickSort(int[] arr) {
int begin = 0;
int end = arr.length - 1;
quickSort(arr, begin, end);
}
public static void quickSort(int[] arr, int begin, int end) {
//每次進入遍歷時從最後一個開始向前遍歷
boolean inBegin = true;
int left = begin;
int right = end;
//標記標誌位
int title=begin;
if (begin >= end)
return;
while(left<right){
if (inBegin == true) {
while (arr[left] <= arr[right] && left < right) {
right--;
}
if (arr[left] > arr[right] && left < right) {
inBegin = (!inBegin);
swap(arr, left, right);
//轉移後標誌數的所在數組下標
title = right;
}
}
if (inBegin == false) {
while (arr[left] <= arr[right] && left < right) {
left++;
}
if (arr[left] > arr[right]) {
inBegin = (!inBegin);
swap(arr, left, right);
//轉移後標誌數的所在數組下標
title = left;
}
}
}
quickSort(arr, begin, title );
quickSort(arr, title + 1, end);
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//測試
public static void main(String[] args) {
int[] a = {15,56,1, 21, 5,16,2,69,5,498,6,1515,45,561,23,16,65,21,2};
quickSort(a);
System.out.println(Arrays.toString(a));
}
}