快速排序算法
快速排序算法原理:
个人理解,快速排序算法就是一个不断重复的二分法,将一个数组或列表分成两部分,选择一个基准元素,令左侧部分都比这个基准元素小,右侧部分都比基准元素大。然后对左右两部分递归调用,不断循环,从而得到一个有序的数组。
例如:有一个int数组{ 49, 38, 65, 97, 76, 13, 27, 50 }
1、首先选取第一个元素作为基准元素。index = 49
2、先从右向左顺序比对,只要遇到比49小的,就将49这个位置替换掉,然后调换顺序,从左向右开始比对。
3、从左向右顺序比对时,只要遇到比49大的,将上次替换者的位置替换掉,然后调换比对顺序。
执行步骤:
1、从后向前比对,遇到27 < 49时第一次替换。然后调换比对顺序
{ 27, 38, 65, 97, 76, 13, 27, 50 }
2、从前向后比对,遇到65 > 49,然后替换刚刚27的位置,调换顺序。
{ 27, 38, 65, 97, 76, 13, 65, 50 }
3、遇到13 < 49 替换刚刚65的位置,调换顺序
{ 27, 38, 13, 97, 76, 13, 65, 50 }
4、遇到97 > 49 替换刚刚13的位置,调换顺序
{ 27, 38, 13, 97, 76, 97, 65, 50 }
这时已经循环完毕后,将最后的替换者97 ,用49替换。
{ 27, 38, 13, 49, 76, 97, 65, 50 }
到现在一次二分循环就完成了。得到49左侧的都比49小,右侧的都比49大。
然后进行递归调用,将 {27, 38, 13}和{ 76, 97, 65, 50 }分别通过上述方法进行二分,最后全部循环完毕时就可以得到一个有序的数组。
具体代码如下:
public static void main(String[] args) throws Exception {
int[] arr = { 49, 38, 65, 97, 76, 13, 27, 50 };
// 传递数组,low表示要进行二分的起始位置,high表示结束位置
sort(arr, 0, arr.length-1);
for (int v : arr) {
System.out.print(v + " ");
}
}
public static void quickSort(int[] arr, int low, int high) {
if (low >= high) {
return;
}
int i = low;
int j = high;
int index = arr[low];
while (i < j) {
while (i < j && arr[j] >= index) {
j--;
}
if (i < j) {
arr[i] = arr[j];
}
while (i < j && arr[i] <= index) {
i++;
}
if (i < j) {
arr[j] = arr[i];
}
}
arr[i] = index;
quickSort(arr, low, i - 1);
quickSort(arr, i + 1, high);
}