我的算法日志:排序算法之快速排序
- 快速排序(Quicksort)是对冒泡排序的一种改进,由C. A. R.Hoare在1960年提出。
- 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
以6、1、7、9、3、8、2、10、3、7
这10个数为例,首先要在这个序列中随便找一个基准数(为了方便,一般都选第一个元素作为基准数),我们现以6为基准数。
接下来操作的目的就是为了让比基准数6大的数放在6的左边,比基准数6小的数放在6的右边。
具体的操作方法是:先从右往左找到第一个小于6的数,在从左往右找到第一个大于6的数,然后交换他们!
java代码实现:
1 package com.guohao.arithmetics; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 /** 7 * 快速排序 8 */ 9 public class QuickSort { 10 public static void main(String[] args){ 11 Scanner reader = new Scanner(System.in); 12 int n = reader.nextInt(); //待排序的元素个数 13 int[] arr = new int[n]; //用于储存待排序元素的数组 14 15 //用户从键盘输入待排序元素 16 for (int i=0; i<n; i++){ 17 arr[i] = reader.nextInt(); 18 } 19 reader.close(); 20 21 sort(arr, 0, arr.length-1); //调用sort方法对数组arr进行排序 22 23 System.out.println("排序后的数组:"+ Arrays.toString(arr)); 24 } 25 26 /** 27 * 将整型数组arr中的元素从小到大排序 28 * @param arr 29 * @param left 30 * @param right 31 */ 32 public static void sort(int[] arr, int left, int right){ 33 if(left > right){ 34 return ; 35 } 36 37 int temp = arr[left]; //基准数temp 38 int i=left, j=right; 39 40 while(i != j){ 41 while(arr[j]>=temp && i<j){ //从右向左找到一个比temp小的数,记录其下标 42 j--; 43 } 44 45 while(arr[i]<=temp && i<j){ //从左向右找到一个比temp大的数,记录其下标 46 i++; 47 } 48 49 if(i < j){ //交换两个数的位置 50 int t = arr[i]; 51 arr[i] = arr[j]; 52 arr[j] = t; 53 } 54 } 55 56 //使基准数归位 57 arr[left] = arr[i]; 58 arr[i] = temp; 59 60 sort(arr, left, i-1); //递归处理基准数左边的元素 61 sort(arr, i+1, right); //递归处理基准数右边的元素 62 } 63 }