插入排序思想:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使这n个数也是排好顺序的。如此反复循环,直到全部排好顺序.(当待排序数据全部有序时,时间复杂度为O(N),最坏情况下时间复杂度为O(N*N),与待排序数据的状态有关).

public class InsertSort {    public static void insertSort(int[] arr) {        if(arr == null || arr.length < 2)            return ;        for(int i = 1; i < arr.length; i++) {            for(int j = i -1; j >= 0 && arr[j] > arr[j+1]; j--)                swap(arr, j , j+1);        }    }    public static void swap(int[] arr, int i, int j) {        int tmp = arr[i];        arr[i] = arr[j];        arr[j] = tmp;    }    public static void main(String[] args) {        int[] arr = new int[] {3,434,24,656,57,54,88,66};        System.out.print("原始数组:");        for(int i = 0; i < arr.length; i++)            if(i != arr.length - 1)            System.out.print(arr[i] + " ");            else                System.out.println(arr[i]);        insertSort(arr);        System.out.print("插入排序后:");        for(int i = 0; i < arr.length; i++)            if(i != arr.length - 1)                System.out.print(arr[i] + " ");            else                System.out.println(arr[i]);    }}

运行结果:

归并排序思想:归并排序是利用归并的思想实现的排序方法,即分治法,分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案合在一起,即分而治之。

public class MergeSort {    public static void mergeSort(int[] arr) {        if(arr == null || arr.length < 2)            return ;        sortProgress(arr, 0, arr.length - 1);    }    public static void sortProgress(int[] arr, int L, int R) {        if(L == R)            return ;        int mid = L + ((R - L) >> 1);         sortProgress(arr, L, mid);         sortProgress(arr, mid+1, R);        merge(arr, L, mid, R);    }    public static void merge(int[] arr, int L, int mid, int R){        int[] help = new int[R- L + 1];        int i = 0;        int p1 = L;        int p2  = mid + 1;        while(p1 <= mid && p2 <= R) {            help[i++] = arr[p1] < arr[p2]? arr[p1++]: arr[p2++];        }        while(p1 <= mid) {            help[i++] = arr[p1++];        }        while(p2 <= R) {            help[i++] = arr[p2++];        }        for(i = 0; i < help.length; i++)            arr[L + i] = help[i];    }    public static void main(String[] args)    {        int[] arr = new int[] {45,3,5445,34,676,545,66,88};        System.out.print("原始数组:");        for(int i = 0; i < arr.length; i++)            if(i != arr.length - 1)            System.out.print(arr[i] + " ");            else                System.out.println(arr[i]);        mergeSort(arr);        System.out.print("归并排序后:");        for(int i = 0; i < arr.length; i++)        if(i != arr.length - 1)            System.out.print(arr[i]+" ");        else            System.out.println(arr[i]);    }}

运行结果:

插入排序优点:稳定排序
缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候
归并排序优点:效率高,时间复杂度为O(N*logN),是一种稳定的算法.
缺点:归并排序需要O(n)的辅助空间,而与之效率相同的快排和堆排分别需要O(logn)和O(1)的辅助空间,在同类算法中归并排序的空间复杂度略高

©著作权归作者所有:来自51CTO博客作者wx5d3c7e0ad6c30的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 分布式数据库30讲
  2. 3-18(排序的完结)
  3. 排序算法——快速排序
  4. 排序算法——插入排序
  5. 2021-03-17:手写代码:单链表插入排序。
  6. 3-17(排序)
  7. 排序算法——选择排序
  8. 排序算法——冒泡排序
  9. 2021-03-16:手写代码:单链表归并排序。

随机推荐

  1. 创建 PSR-4 的 Php 包
  2. 看看PHP 多进程处理任务
  3. 一定要改掉 这5个PHP编程中的不良习惯!
  4. PHP安全问题汇总
  5. 详解PHP中被忽略的性能优化利器:生成器
  6. 教你使用PHP实现查找你想要的附近人
  7. 你可能要纠正这5个PHP编码小陋习!
  8. PHP处理时间和时区需注意以下三点!
  9. php+redis实现全页缓存系统
  10. 分享php秒杀功能实现的思路