排序算法

 1 package sort;
 2 
 3 /**
 4  * @Description
 5  * @Author Created by t.wu on 2017/8/21.
 6  */
 7 public class QuickSort {
 8 
 9     public void sort(int[] a, int l, int r) {
10         if (l < r) {
11             int split = partition(a, l, r);
12             sort(a, l, split);
13             sort(a, split + 1, r);
14         }
15     }
16 
17     /**
18      * 直接就地把小于pivot的数顺序放到a的起始位置
19      * @param a
20      * @param l
21      * @param r
22      * @return
23      */
24     public static int partition(int[] a, int l, int r) {
25         int pivot = a[r];
26         int i = l - 1;
27         int j;
28         for (j = l; j <= r - 1; j++) {
29             if (a[j] <= pivot) {
30                 i++;
31                 int temp = a[i];
32                 a[i] = a[j];
33                 a[j] = temp;
34             }
35         }
36         // 这时i的左边都是小于 pivot的,所以把i+1的位置和pivot调换
37         pivot = a[i + 1];
38         a[i + 1] = a[r];
39         a[r] = pivot;
40         return i + 1;
41     }
42 }
 1 package sort;
 2 
 3 /**
 4  * @Description 堆排序
 5  * 算法思想:
 6  * @Author Created by t.wu on 2017/8/21.
 7  */
 8 public class HeapSort {
 9 
10     /**
11      * 保证任意节点的值都大于其子节点的值
12      * 如何保证这个树的中任意节点都有左右两个子节点?
13      * 答案就在建树的过程中。
14      * 注意 数组索引从0开始,左右子树的索引正确的算法,就应该分别是 2 * 1 + 1 , 2 * i + 2
15      * @param a
16      * @param heapSize
17      * @param index
18      */
19     public void heapfy(int[] a, int heapSize, int index) {
20         int left = 2 * index +1;
21         int right = 2 * index + 2;
22         int max = index;
23         if (left < heapSize && a[max] < a[left]) {
24             max = left;
25         }
26         if (right < heapSize && a[max] < a[right]) {
27             max = right;
28         }
29         if (max != index) {
30             int tmp = a[index];
31             a[index] = a[max];
32             a[max] = tmp;
33             heapfy(a, a.length, max);
34         }
35     }
36 
37     public void createHeap(int[] a) {
38         int middle = a.length / 2 -1;
39         for (int i = middle; i >= 0; i--) {
40             heapfy(a, a.length,i);
41         }
42     }
43 
44     /**
45      * 取出最大的a[0],放在最后,再对剩下的数组进行heapfy。
46      * @param a
47      */
48     public void sort(int[] a){
49         for(int i = a.length-1 ; i >=0 ; i--){
50             int tmp = a[0];
51             a[0] = a[i];
52             a[i] = tmp ;
53 
54             heapfy(a,i,0);
55             System.out.println("====dd====");
56             for(int j : a){
57                 System.out.print(j+" ");
58             }
59         }
60     }
61 
62     public static void main(String[] args) {
63         int[] a = new int[] {17,13,4,51,67,5};
64         HeapSort hs = new HeapSort();
65         hs.createHeap(a);
66         hs.sort(a);
67         System.out.println("========");
68         for(int i : a){
69             System.out.print(i+" ");
70         }
71     }
72 }
 1 package sort;
 2 
 3 /**
 4  * @Description 插入排序
 5  * 算法思想:从数组第二个位置开始,以当前位置的值和其前面所有值进行比较,凡是比当前值大的都向后移一位。
 6  * @Author Created by t.wu on 2017/8/19.
 7  */
 8 public class InsertSort {
 9     /**
10      *
11      * @param a
12      */
13     public void sort(int[] a){
14         for(int i=1; i<a.length ; i++){
15             int pivot = a[i];
16             int j = i-1;
17             while(j>=0 && a[j]> pivot){
18                 a[j+1] = a[j];
19                 j--;
20             }
21             // 跳出循环,意味着 j=-1<0 or a[j] < pivot,
22             // j=-1时,j+1 = 0 ,也就从j >=1 开始的位置逗比 pivot大,则a[0] = pivot
23             // a[j] < pivot 意味着 a[j+1] 开始都大于pivot,原来的j+1位置因为大于pivot,所以已经后移了,这时j+1的位置其实是“空”的。
24             // 所以pivot 放在j+1 正好,前面都比他小,后面都比他大。
25              a[j+1] = pivot;
26         }
27     }
28 
29     public static void main(String[] args) {
30         int[] a = new int[] {17,13,4,51,67,5};
31         new InsertSort().sort(a);
32         for(int i : a){
33             System.out.println(i);
34         }
35     }
36 }
 1 package sort;
 2 
 3 /**
 4  * @Description 归并排序
 5  * 算法思想:想象两叠牌,两叠牌都是有序的,如何让他们合并成一个有序的数列?
 6  * 1. 首先二分数组 length /2  并下取整。
 7  * 2. 每次从左右队列中各取一个数,进行比较,小的放进原数组的相应位置。
 8  * 3. 注意:边界条件,当p>=r时,说明没有可再二分的数。所以一定是最先分到左右数组各有一个数为止,开始合并这两个数组。
 9  * @Author Created by t.wu on 2017/8/19.
10  */
11 public class MergeSort {
12 
13     private void merge(int[] a , int p,int q, int r ){
14         int n1 = q-p+1+1;
15         int n2 = r-q+1;
16         int[] left = new int[n1];
17         int[] right = new int[n2];
18         for(int i = 0 ; i< left.length-1; i++){
19             left[i]= a[p+i];
20         }
21         for(int i = 0 ; i< right.length-1; i++){
22             right[i]= a[q+1+i];
23         }
24         left[q-p+1] = Integer.MAX_VALUE;   // (1) 最大的数放在这里,方便比较且不会越界
25         right[r-q] = Integer.MAX_VALUE;
26 
27         int j =0;
28         int i =0;
29         for(int k = p; k<=r; k++ ){
30             if(left[i]<right[j]){   //(1)
31                 a[k] = left[i];
32                 i++;
33             }else{
34                 a[k] = right[j];
35                 j++;
36             }
37         }
38     }
39     public void sort(int[] a,int p,int r ){
40         if(p<r){
41             int middle = (r+p)/2 ;
42             sort(a,p,middle);
43             sort(a,middle+1,r);
44             merge(a,p,middle,r);
45         }
46     }
47     public static void main(String[] args) {
48         int[] a = new int[] {17,13,4,51,67,5};
49         new MergeSort().sort(a,0,a.length-1);
50         for(int i : a){
51             System.out.print(i+" ");
52         }
53     }
54 }
原文地址:https://www.cnblogs.com/parkin/p/7689716.html