快速排序算法

package com.liu.sort_test;


/**
 * 快速排序算法 (使用遞歸)
 *  基本要求:
 * 1.要有一個基數 
 * 2.左右兩個下標指針(left_point,right_point),用於從數組兩邊開始遍歷
 * 3.從左找第一比基數大的,從右找第一個比基數小的 
 * 4.如果left_point <right_point,交換指針指向的元素位置
 * 5.如果left_point > right_point ,right_point指針指向的元素與基數的位置進行交換
 * 6.遞歸遍歷(1,right_point-1) 
 * 7.遞歸遍歷(right_point+1,arr.length);
 * 
 * @author liu
 * 
 */
public class QuickSort {
static int arr[] = new int[] { 1, 3, 2, 5, 4, 7, 8, 0, 9 };


public static void main(String[] args) {
new QuickSort().quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}


/**

* @param arr
*            要排序的數組
* @param left
*            排序數組的左起始位置
* @param right
*            排序數組的右終止位置(不包括該位置)
*/
public void quickSort(int[] arr, int left, int right) {
int leftPoint = 0;
int rightPoint = 0;
//arr[left]是基數
int temp = 0;// 用於臨時存放數據
if (left < right) {
// 初始化指針
leftPoint = left + 1;
rightPoint = right;
}
// 從左邊尋找第一個比基數大的元素
while (true) {
for (int i = left + 1; i < right; i++) {
if (arr[i] > arr[left]){
// 找到後將左指針指向該位置
leftPoint = i;
break;
}
// 不然就讓指針右移動一位
leftPoint++;
}
// 從右邊開始尋找比基數小的第一個元素
for (int j = right; j >= left + 1; j--) {
if (arr[j] < arr[left]){
// 找到後將右指針指向該位置
rightPoint = j;
break;
}
// 不然就讓指針左移動一位
rightPoint--;
}
if (leftPoint < rightPoint) {
// 交換位置
temp = arr[rightPoint];
arr[rightPoint] = arr[leftPoint];
arr[leftPoint] = temp;
}else break;

}
if (leftPoint > rightPoint) {
temp=arr[left];
arr[left] = arr[rightPoint];
arr[rightPoint] = temp;
quickSort(arr, left, rightPoint - 1);
quickSort(arr, rightPoint + 1, right);
}
}
}
發佈了26 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章