今天看了一篇文章,关于快速排序的,了解了快排的主要思想是:
1、先从数列中取出一个数作为基准数
2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
3、再对左右区间重复第二步,直到各区间只有一个数
然后再看了网上的一些排序的整体流程,自己用java实现了下快排的算法,可以说根据网上的流程,然后抽出当中重复的部分,编写成一个方法,然后递归调用就好了。
通过自己的动手实现感觉,这个基准数貌似应该选择首位或者末位的数进行比较,因为我个人再实现过程中,发现只要我取不是取首位或者末尾的数作为基准,排序总是
会存在问题,但是整个流程又是照着网上说明的核心步骤写的,哎~不知道是不是自己学艺不精啊~另外,当我们选择的是首个数作为基准的时候,我们必须要从排序区块
的尾部开始排序,否则反之,不然是无法排序出来的。不管有没有问题,至少在满足我所认为应该满足的基础上是可以实现效果了的,以前上学的时候还没有搞懂过快排
呢!有点成就感。下面是我的代码,^_^
1 package 算法.排序; 2 3 import java.util.Random; 4 /** 5 * 快速排序 6 * @author Administrator 7 * 8 */ 9 public class QuickSort { 10 // 被排序数组 11 static int[] beSortArr = {5,12,6,9,3,1,10,12}; 12 public static void main(String[] args) { 13 sortCore(0, beSortArr.length-1); 14 for (int i = 0;i<beSortArr.length;i++) { 15 System.out.print(beSortArr[i]); 16 if (i != beSortArr.length - 1) { 17 System.out.print(" "); 18 } 19 } 20 System.out.println(); 21 } 22 23 /** 24 * 快速排序算法的核心代码 25 */ 26 public static void sortCore(int a, int b) { 27 if (a > b) { 28 return; 29 } 30 // 这里的基准一般取左或者取右,在取左的时候,那么就要先从数组右边开始比较,否则反之。 31 // 不然的话,数组将无法正常被排序 32 int Xps = b; 33 int standardValue = beSortArr[Xps]; 34 // 左边跑 35 boolean isLeftGo = true; 36 for (int tempA = a, tempB=b; tempA != tempB;) { 37 if (isLeftGo) { 38 if (beSortArr[tempA] > standardValue) { 39 // 数据交换 40 int tempChangeSpace = beSortArr[tempA]; 41 beSortArr[tempA] = standardValue; 42 beSortArr[Xps] = tempChangeSpace; 43 Xps = tempA; 44 // 从右边跑 45 isLeftGo = false; 46 } else { 47 tempA++; 48 } 49 } else { 50 if (beSortArr[tempB] < standardValue) { 51 // 数据交换 52 int tempChangeSpace = beSortArr[tempB]; 53 beSortArr[tempB] = standardValue; 54 beSortArr[Xps] = tempChangeSpace; 55 Xps = tempB; 56 // 从左边跑 57 isLeftGo = true; 58 } else { 59 tempB--; 60 } 61 } 62 } 63 sortCore(a, Xps-1); 64 sortCore(Xps+1, b); 65 } 66 }