快速排序算法原理
快速排序分为以下几个步骤:
- 从数组选定一个值,作为基准,选定两个变量i,j,分别指向数组的头和尾;
- 找到第一个比基准小的值,如果没找到就j–直到找到为止;
- 找到一个比基准大的值,如果没找到就i++直到找到为止;
- 交换这个两个值;
- 重复2、3、4三步,直到i>=j停止,此时数组的前半部分比基准值小,后半部分比基准值大;
- 对前后两部分重复上面的步骤,当前后两部分都有序以后,整个数组就有序了。
代码实现
这里实现的与上面有点不一样,这里是按降序来排列的,上面的描述是升序的。
public class QuickSort {
public static int[] qsort(int[] arr, int start, int end) {
int pivot = arr[start];
int i = start;
int j = end;
while (i < j) {
//找到比pivot大的值
while((i < j) && (arr[j] < pivot)) {
j--;
}
//找到比pivot小的值
while ((i < j) && (arr[i] > pivot)) {
i++;
}
if (arr[i] == arr[j] && (i < j)) {
i++;
} else {
//进行交换
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
//对前一部分进行排序
if (i - 1 > start) {
qsort(arr, start, i - 1);
}
//对后一部分进行排序
if (j + 1 < end) {
qsort(arr, j + 1, end);
}
return arr;
}
public static void main(String[] args) {
int[] arr = new int[] {3,3,3,7,9,122344,4656,34,34,4656,5,6,7,8,9,343,57765,23,12321};
int len = arr.length - 1;
arr = qsort(arr, 0, len);
for (int i : arr) {
System.out.print(i + "\t");
}
}
}