zoukankan      html  css  js  c++  java
  • 排序算法

     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 }
  • 相关阅读:
    Python Pandas基本操作
    自监督 论文 Self-supervised Visual Feature Learning with Deep Neural Networks
    KDD 论文 Multimodal Attentional Neural Networks for Diagnosis Prediction
    实例分割 论文 Multi-scale Cell Instance Segmentation with Keypoint Graph Based Bounding Boxes
    Torchtext使用教程 文本数据处理
    KDD 论文 Measuring Patient Similarities via a Deep Architecture with Medical Concept Embedding
    Python 进阶知识点
    Python 多进程和多线程
    Memcached服务端以及Memcached API部署
    Linux-Dockerfile指令详解
  • 原文地址:https://www.cnblogs.com/parkin/p/7689716.html
Copyright © 2011-2022 走看看