排序

1冒泡排序

/*
 * @Author liuhaidong
 * @Description 冒泡排序
 * @Date 15:43 2019/9/15 0015
 * @Param
 * @return
 **/
public static void BubbleSort(long[] arr){
    long tmp = 0;
    for(int i=0;i<arr.length-1;i++){
        for(int j=arr.length-1;j>i;j--){
            //进行交换
            if(arr[j] <arr[j-1]){
                tmp = arr[j];
                arr[j] = arr[j -1];
                arr[j-1] = tmp;
            }
        }
    }
}

方法2

/** * @Author liuhaidong * @Description 冒泡排序 * @Date 14:35 2019/10/2 0002 */
    private static void BubbleSort(int[] source) {
   
        int tmp = 0;
        for(int i =0;i<source.length;i++){
   
            for (int j =0;j<source.length-1-i;j++){
   
                if(source[j]>source[j+1]){
   
                    tmp = source[j+1];
                    source[j+1] = source[j];
                    source[j] = tmp;
                }
            }
        }
``

图示


外层循环决定几次,内层循环决定循环几次

2选择排序

(相比比冒泡排序效率高一点)

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

/*
 * @Author liuhaidong
 * @Description 选择排序
 * @Date 16:01 2019/9/15 0015
 * @Param
 * @return
 **/
public static void SelectionSort(long[] arr){
    int k = 0;
    long tmp = 0;
    for(int i = 0;i<arr.length-1;i++){
        k = i;
        for(int j =i;j<arr.length;j++){
            if(arr[j] <arr[k]){
                k = j;
            }
        }
        tmp = arr[i];
        arr[i] = arr[k];
        arr[k] = tmp;
    }
}

图示

3直接插入排序

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。

实例
基本思想:
  把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。
 实例:
  0.初始状态 3,1,5,7,2,4,9,6(共8个数)
   有序表:3;无序表:1,5,7,2,4,9,6
  1.第一次循环,从无序表中取出第一个数 1,把它插入到有序表中,使新的数列依旧有序
   有序表:1,3;无序表:5,7,2,4,9,6
  2.第二次循环,从无序表中取出第一个数 5,把它插入到有序表中,使新的数列依旧有序
   有序表:1,3,5;无序表:7,2,4,9,6
  3.第三次循环,从无序表中取出第一个数 7,把它插入到有序表中,使新的数列依旧有序
   有序表:1,3,5,7;无序表:2,4,9,6
  4.第四次循环,从无序表中取出第一个数 2,把它插入到有序表中,使新的数列依旧有序
   有序表:1,2,3,5,7;无序表:4,9,6
  5.第五次循环,从无序表中取出第一个数 4,把它插入到有序表中,使新的数列依旧有序
   有序表:1,2,3,4,5,7;无序表:9,6
  6.第六次循环,从无序表中取出第一个数 9,把它插入到有序表中,使新的数列依旧有序
   有序表:1,2,3,4,5,7,9;无序表:6
  7.第七次循环,从无序表中取出第一个数 6,把它插入到有序表中,使新的数列依旧有序
   有序表:1,2,3,4,5,6,7,9;无序表:(空)

/*
 * @Author liuhaidong
 * @Description  直接插入排序
 * @Date 16:31 2019/9/15 0015
 * @Param
 * @return
 **/
public static void InsertSort(long[] arr){
    long tmp = 0;
    int i ,j;
     //从第二个元素开始遍历即可
    for(i = 1; i < arr.length; i++) {
        /**
         * temp为本次循环待插入有序列表中的数
         */
        tmp = arr[i];
     //从参考值前面一个元素开始从后往前查找
        for(j = i-1;j >=0 && arr[j] > tmp;j--)
        {
            /**
             * 元素后移,为插入temp做准备
             */
            arr[j+1] = arr[j];
        }
        /**
         * 插入temp
         */
        arr[j+1] = tmp;
    }
}