博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序算法
阅读量:7003 次
发布时间:2019-06-27

本文共 4693 字,大约阅读时间需要 15 分钟。

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 a20      * @param l21      * @param r22      * @return23      */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 + 215      * @param a16      * @param heapSize17      * @param index18      */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 a47      */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 a12      */13     public void sort(int[] a){14         for(int i=1; i
=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] = pivot23 // 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]

 

转载于:https://www.cnblogs.com/parkin/p/7689716.html

你可能感兴趣的文章