快速排序
1. 快速排序的思想:
通过将一个数组划分为两个字数组,然后通过递归调用自身为每个字数组进行快速排序来实现。
2. 如何进行划分:
设定关键字,将比关键字小的数据放在一组,比关键字大的放在另一组。
3. 如何自动设定关键字:
设置数组最右端的数据为关键字。
快速排序的实现:
/*
* 快速排序
*/
public classQuickSort {
/**
* 划分数组
*/
public static int partition(long arr[],int left, int right,long point) {
int leftPtr = left - 1;
int rightPtr = right;
while(true) {
//循环,将比关键字小的留在左端
while(leftPtr < rightPtr&& arr[++leftPtr] < point);
//循环,将比关键字大的留在右端
while(rightPtr > leftPtr&& arr[--rightPtr] > point);
if(leftPtr >= rightPtr){
break;
}else{
long tmp = arr[leftPtr];
arr[leftPtr]= arr[rightPtr];
arr[rightPtr]= tmp;
}
}
//将关键字和当前leftPtr所指的这一个进行交换
long tmp = arr[leftPtr];
arr[leftPtr]= arr[right];
arr[right]= tmp;
return leftPtr;
}
public static void displayArr(long[] arr) {
System.out.print("[");
for(long num : arr) {
System.out.print(num + " ");
}
System.out.print("]");
System.out.println();
}
public static void sort(long[] arr, int left, int right) {
if(right - left <= 0) {
return;
}else{
//设置关键字
long point = arr[right];
//获得切入点,同时对数组进行划分
int partition = partition(arr,left, right, point);
//对左边的子数组进行快速排序
sort(arr,left,partition- 1);
//对右边的子数组进行快速排序
sort(arr,partition+ 1, right);
}
}
}
public classTestQuickSort {
public static void main(String[] args) {
long[] arr = new long[10];
for(int i = 0; i < 10;i++) {
arr[i]= (long)(Math.random() * 99);
}
QuickSort.displayArr(arr);
QuickSort.sort(arr,0, arr.length- 1);
QuickSort.displayArr(arr);
}
}
运行结果:
[7 63 40 63 9 71 61 26 9 21 ]
[7 9 9 21 26 40 61 63 63 71 ]