快速排序算法

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章