快速排序
原理
在数组中以任意一个数据作为分区点,比分区点的放到分区点右边,比分区点小的放分区点左边,递归的继续为左右分区进行相同操作,直至每个区间缩小为1。
时间复杂度:O(nlogn)
代码与注释
public class TestSort {
public static void main(String[] args) {
int[] arr = {9,8,7,6,5,4,3,2,1};
customQuickSort(arr,0,arr.length-1);
print(arr,"快速排序");
}
public static void print(int[] arr,String s){
System.out.print(s+":");
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
}
public static void customQuickSort(int[] arr, int low, int high){
int i,j,temp,t; // 定义左右指针, temp 用作分区点,t用作与分区点与指针重合交换的变量
if (low > high){
return;
}
i = low; // 左边界
j = high; // 右边界
temp = arr[low]; // 分区点
while (i<j){
while (temp<=arr[j]&&i<j){ // 分区点右边指针指向数组的值大于分区点,指针左移
j--;
}
while (temp>=arr[i]&&i<j){ //分区点左边指针指向数组的值小于分区点,指针右移
i++;
}
// 上面两个循环判断完后,即i 指针与 j 指针指向的数据都分别大于分区点和小于分区点,然后将两个指针指向的数据进行交换
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
// 进行下一次循环,判断 两个指针是否相遇,相遇就停止
}
// 将分区点与i=j的数组数据进行交换
arr[low] = arr[i];
arr[i] = temp;
// 分组 然后进行排序,此时的j为上一个分区点
customQuickSort(arr,low,j-1); // 左子组
customQuickSort(arr,j+1,high); // 右子组
}
}
总结
- 定义两个左右指针
- 定义两个临时变量,一个用作分界点,一个用作左右指针指向的数据交换
- 定义一个循环,当左右指针相等时,交换指针指向的数据与分界点
- 第一个循环内部再定义两个循环,一右指针大于分界点左移,二左指针小于分界点右移
- 递归排序分界点左边分区,递归排序分界点右边分区