今天复习快速排序法。快速排序法主要分为三步:分割、分割、合并。下面是代码:
package com.sort;
import java.util.Random;
/**
*
* 快排策略一:对初始排序序列,先备份轴元素(一般为首元素),取两个游标left和right分别从左到右扫描,右到左扫描。left指向最左边的下标,right指向最右边
* 的下标。游标移动规则为:首先right向左搜索,找到第一个不大于轴元素的,把它移动到left的位置。再从left向右搜索,找到一个大于轴的元素,把它移动到right的位置。
* 重复上述过程,直到left=right,最后把轴元素放在right的位置
*
* @author zhang
* @date 2015年5月26日 下午6:47:51
*/
public class QuickSort {
public static int LENGTH=12;
public static void main(String[] args) {
int[] arr=new int[LENGTH];
initArr(arr);
displayArr(arr);
quickSort(arr);
displayArr(arr);
}
public static void quickSort(int[] arr) {
quickSort(arr,0,arr.length-1);
}
/**
*
* @param arr 需要排列序列数组
* @param left 需要排序序列的最左元素下标
* @param right 需要排序序列的最右元素下标
*/
private static void quickSort(int[] arr, int left, int right) {
if(left < right){
int pivot = arr[left];
int beg = left;
int end = right;
while (beg < end) {
while(end > beg && arr[end] > pivot)
end--;
arr[beg] = arr[end];
while(end > beg && arr[beg] <= pivot)
beg++;
arr[end] = arr[beg];
}
arr[end] = pivot;
quickSort(arr, left, end-1);
quickSort(arr, end+1, right);
}
}
/**
* 遍历数组
* @param arr
*/
public static void displayArr(int[] arr) {
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
}
/**
* 通过随机数为一个int类型数组进行初始化赋值
* @param arr
*/
public static void initArr(int[] arr) {
Random rd=new Random();
for (int i = 0; i < arr.length; i++) {
arr[i]=rd.nextInt(arr.length);
}
}
}
package com.sort;
import java.util.Random;
/**
* 快速策略二:
* 分别从待排序序列的两边相向遍历,即从左向右确定第一大于轴元素的元素,
* 从右向左确定第一个不大于轴元素的元素,然后交换二者
* @author zhang
* @date 2015年5月26日 下午6:46:06
*/
public class QuickSort2 {
public static int LENGTH=12;
public static void main(String[] args) {
int[] arr=new int[LENGTH];
initArr(arr);
displayArr(arr);
quickSort(arr);
displayArr(arr);
}
/**
*
* @param arr
*/
public static void quickSort(int[] arr) {
quickSort(arr,0,arr.length-1);
}
/**
*
* @param arr 需要排列序列数组
* @param left 需要排序序列的最左元素下标
* @param right 需要排序序列的最右元素下标
*/
private static void quickSort(int[] arr, int left, int right) {
if(left < right){
int pivot = arr[left];
int beg = left;
int end = right;
while (beg <= end) {
while(end >= beg && arr[end] > pivot)
end--;
while(end >= beg && arr[beg] <= pivot)
beg++;
if(beg < end){
//交换两个元素的值
int temp = arr[beg];
arr[beg] = arr[end];
arr[end] = temp;
beg++;
end--;
}
}
arr[left] = arr[end];
arr[end] = pivot;
quickSort(arr, left, end-1);
quickSort(arr, end+1, right);
}
}
/**
* 遍历数组
* @param arr
*/
public static void displayArr(int[] arr) {
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
}
/**
* 通过随机数为一个int类型数组进行初始化赋值
* @param arr
*/
public static void initArr(int[] arr) {
Random rd=new Random();
for (int i = 0; i < arr.length; i++) {
arr[i]=rd.nextInt(arr.length);
}
}
}