快速排序
介绍:
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
原理:
1.分解
初始时将数组分解为以选定的基准为分界线的两个数组:
a.大于或等于基准的数组
b.小于或等于基准的数组
while(left<right) {
//先看右边,依次往左递减
while (list[right]>=list[stand]&&left<right) {
right--;
}
//再看左边,依次往右递增
while (list[left]<=list[stand]&&left<right) {
left++;
}
//如果满足条件则交换
if (left<right) {
swap(list,left,right);
}
}
2.求解
通过递归算法求解左右两边的两个数组
//递归求解左半边数组
quicksort(list,low,right-1);
//递归求解右半边数组
quicksort(list,right+1,high);
步骤:
1.假设有一个随机数列:{1,6,8,9,2,4,3,5,7}
2.选定一个基准(可以是数组中的任意一个元素,一般用数组的第一个或者最后一个).这里选用最后一个元素7.
3.将最左边的数字标示为做标记left最右边的数列标示为右标记right.
4.准备工作就绪,接下来进行排序:右标记开始向左移动,左标记不动,当右标记遇到小于或等于基准7的数时停止移动,换成左标记向右移动,右标记不动,当左标记遇到大于或等于基准7的数时停止移动,交换左右标记指向的数的值。然后右标记继续移动……根据以上规律,当左右标记的值相等时,停止移动,将基准的值与左右标记指向的值交换。这样就得到以选定的基准为分界线的左右两边:左边小于或等于基准,右边大于或等于基准.
5.利用递归算法分别求解左右两边,最后将等到排好序的原数列.
代码:
public class QuickSort {
public static void main(String[] args) {
int[] arr = {1,6,8,9,2,4,3,5,7};
quicksort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
System.out.print(" ");
}
}
public static void quicksort(int[] list,int low,int high) {
if(low<high){
int stand = low; //基准
int left = low;
int right = high;
//把数组分成左右两边,左边小于或等于基准,右边大于或等于基准
while(left<right) {
//先看右边,依次往左递减
while (list[right]>=list[stand]&&left<right) {
right--;
}
//再看左边,依次往右递增
while (list[left]<=list[stand]&&left<right) {
left++;
}
//如果满足条件则交换
if (left<right) {
swap(list,left,right);
}
}
swap(list,left,stand);
//递归调用左半边数组
quicksort(list,low,right-1);
//递归调用右半边数组
quicksort(list,right+1,high);
}
}
//将list[a]和list[b]交换
public static void swap(int[] list,int a,int b) {
int tmp = list[a];
list[a] = list[b];
list[b] = tmp;
}
}