快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
32 | |||||||
32 | 12 | 3 | 45 | 15 | 25 | 20 | 24 |
24 | |||||||
24 | 12 | 3 | |||||
24 | 12 | 3 | 45 | ||||
24 | 12 | 3 | 20 | 45 | |||
24 | 12 | 3 | 20 | 15 | 25 | 45 | |
24 | 12 | 3 | 20 | 15 | 25 | 32 | 45 |
第一次,拿第一个数32,
从右向左比,直到找到比32小的数, 拿第一个数32与最后一个数24比,比32小,把24放到第一个位置,
然后从左向右比,直到找到比32大的数,
拿第二个数12与32比,比32小,继续拿第三个数3与32比,比32小,继续拿第四个数45与32比,比32大,将45放到最后一个位置,
第二次,继续按此方法,从两边往中间找,直到找到左边碰到右边,中间没有数了,将32放入该位置,
这时,32左边得数全是比他小的,右边的数全是比他大的,
然后用此方法,将32左边全部数的,拿第一个24,12当作第一个数,最后一个数25当作最后一个数,继续比,直到找完,
代码: package com.wangyq.Test; //快速排序 public class Quick { public int[] quick(int[] array,int left, int right){ int i = left; int j = right; if(left <right){ int tmp = array[i]; do{ while(array[j] > tmp && i < j){ j--; } if(i < j){ array[i] = array[j]; i++; } while(array[i] < tmp && i < j){ i++; } if(i < j){ array[j] = array[i]; j--; } }while(i != j); array[i] = tmp; quick(array, left, i-1); quick(array, i+1, right); } return array; } public static void main(String[] args) { int[] array = { 32, 12, 3, 45, 15, 25, 20, 24 }; array = new Quick().quick(array,0,array.length-1); for (int i = 0; i < array.length; i++) System.out.print(array[i] + " "); } }