package com.qianfeng.day06;
//快速排序
public class LeetCodeTest03 {
public static void main(String[] args) {
int[] arr = new int[] {100,100,64,25,9,0,9,36,64,64};
int[] arrs = qsort(arr, 0, arr.length-1);
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
}
public static int[] qsort(int arr[],int start,int end) {
int pivot = arr[start];
int i = start;
int j = end;
int temp;
while (i<j) {
while ((i<j)&&(arr[j]>pivot)) {
j--;
}
while ((i<j)&&(arr[i]<pivot)) {
i++;
}
if ((arr[i]==arr[j])&&(i<j)) {
i++;
} else {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
if (i-1>start) {
arr=qsort(arr,start,i-1);
}
if (j+1<end){
arr=qsort(arr,j+1,end);
}
return (arr);
}
}
快速排序,主要采用指针法
- 首先取数组第一个元素为标志,然后设定两个指针,第一个指针从被选中的元素开始,第二个指针从该数组的末尾开始,
- 然后第一个指针从左往右移动寻找比标志元素大的元素,没有找到就一直往右移动,第二个指针从右往左寻找比标志元素小的元素,没有找到就一直往左移动。刚开始由于第一个指针是标志元素等于它本身它就停止移动,然后第二个指针找到比标志元素小的那个就置换两个指针对应的元素。
- 同样的当置换之后第二个指针就等于标志元素,于是第一个指针找到比它大的就又置换一次,直到第一个指针等于或大于第二个指针的时候就停止置换。这个时候右边的一定是大于标志元素的数。
- 在置换的过程中如果两个指针所对应的元素相等,那么就使第一个指针加一,这样做的原理是:碰到相等的两个元素,直接越过,交给下次快速排序的数组解决,当然也可以使碰到的时候去使第二个指针减一。
- 最后处理好多次分成部分数组的快速排序,直到数组中只有两个元素拍好后就停止,这个时候整个数组就排序好了