快速排序之java实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序之java实现相关的知识,希望对你有一定的参考价值。

据说一般的笔试或面试都会考考排序,今天就试着想自己实现一把,看了原理后,发现没那么容易,又去网上找了下,发现评论都说作者的代码有问题。这更激起了我的兴趣。

遂坚持编写出来并进行了测试,应该没有问题,如有问题 希望留言评论

快速排序的理论和算法的评价就不粘贴了,网上一查一大堆,在这只写代码

 1 public class QuickSort {
 2     @Test
 3     public void sort(){
 4         int[] a = { 5, 8, 6, 2, 7, 9, 1, 7, 3 };
 5         //int[] a = {3, 1, 2, 5, 7, 9, 6, 4, 8};
 6         
 7         sort(a, 0, a.length-1); 8         System.out.println(Arrays.toString(a));
 9     }
10 
11     private  void sort(int[] a, int start, int end) {
12         int i=start;
13         int j=end;
14         int key = a[i];
15         int tmp;
16         while (j > i) {//向左遍历
17             while (j > i && a[j] >=key)
18                 j--;
19             if (a[j] < key) {
20                 tmp = a[j];  //key存在了a[j]中
21                 a[j] = a[i];
22                 a[i] = tmp;
23             }
24             while (j > i && a[i] <= key)
25                 i++;
26             if (a[i] > key) {
27                 tmp = a[i];
28                 a[i] = a[j];
29                 a[j] = tmp;
30             }
31         }
32         if(j<end)sort(a,j+1,end);
33         if(i>start)sort(a,start,i-1);
34     }
35 
36 }

说说几个我觉得注意的问题:

  1. sort()的形参start,end要赋值给i,j.因为我们要通过下标交换数组中的元素。而且最后还要用到start,end。所以不能直接用start,end操作。
  2. 思想无非就是以start为key从右往左遍历,只要出现了小于key的元素,即交换;而后从左往右遍历,大于key的元素交换
  3. 注意交换的过程中,要想明白,key是在不停的变换位置。
  4. 最后i,j应该相等,跳出最外层while循环
  5. 而后递归调用sort
我遇到的坑,本来自己打算试一下123456789的,结果数组中打了两个7,出现了死循环,后来发现23行没有写成>=(30行没有写成<=).希望初学的读者能想明白为什么要加等号~

 

以上是关于快速排序之java实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-排序之快速排序(使用Java代码实现)

快速排序之java实现

排序算法之快速排序(Java)

排序算法之快速排序(Java)

Java排序算法之快速排序

排序算法入门之快速排序(java实现)