zoukankan      html  css  js  c++  java
  • 几种常见的排序算法集锦

    排序算法有很多,下面只是列举了几种常见的.

    首先定义一个用于交换数组中2个值的方法

    1 //用于交换的方法
    2 public static void swap(Integer[] arr,int a,int b){
    3      int temp;
    4      temp = arr[a];
    5      arr[a] = arr[b];
    6      arr[b] = temp;
    7 }

    冒泡排序   O(n^2)

     1     public static void sort(Integer[] a){
     2         for (int i=0;i<a.length;i++) {
     3 
     4             Boolean flag = true;
     5 
     6             for (int j=a.length-2;j>=i;j--){
     7 
     8                 if (a[j]>a[j+1]){
     9                     swap(a,j,j+1);
    10                     flag = false;
    11                 }
    12             }
    13 
    14             if (flag){
    15                 //数组已经有序
    16                 return ;
    17             }
    18         }
    19     }

    简单选择排序  O(n^2)

     1     public static void sort(Integer[] arr){
     2 
     3         for (int i=0;i<arr.length;i++){
     4             int min = i;
     5             for (int j=i+1;j<arr.length;j++){
     6                 if (arr[j]<arr[min]){
     7                     min = j;
     8                 }
     9             }
    10             if (min != i){
    11                 swap(arr,i,min);
    12             }
    13         }
    14 
    15     }

    直接插入排序  O(n^2)

     1     public static void sort(Integer[] arr){
     2         for(int i=1;i<arr.length;i++){
     3             if (arr[i]<arr[i-1]){
     4                int temp = arr[i];
     5                int j;
     6                 for (j=i-1;j>=0 && arr[j]>temp;j--){
     7                     arr[j+1] = arr[j];
     8                 }
     9                 arr[j+1] = temp;
    10             }
    11         }
    12     }

    希尔排序   O(nlog(n))~ O(n^2)   不稳定

     1     public static void sort(Integer arr[]){
     2         //增量,每次分组的间隔
     3         int increment = arr.length;
     4         //临时变量
     5         int temp;
     6         int j;
     7         while (increment>1){
     8             increment = increment / 3 +1;
     9             for (int i= 0;i<arr.length;i=i+increment){
    10                 temp = arr[i];
    11                 for (j=i-increment;j>=0&&arr[j]>temp;j=j-increment){
    12                     arr[j+increment] = arr[j];
    13                 }
    14                 arr[j+increment] = temp;
    15             }
    16         }
    17     }

    快速排序    O(nlog(n))~ O(n^2)   不稳定

     1     public static void sort(Integer[] arr,int left,int right){
     2         int i,j,temp,t;
     3         if(left>right){
     4             return ;
     5         }
     6         i=left;
     7         j=right;
     8         //temp就是基准位
     9         temp = arr[left];
    10         while (i<j) {
    11             //先看右边,依次往左递减
    12             while (temp<=arr[j]&&i<j) {
    13                 j--;
    14             }
    15             //再看左边,依次往右递增
    16             while (temp>=arr[i]&&i<j) {
    17                 i++;
    18             }
    19             //如果满足条件则交换
    20             if (i<j) {
    21                 t = arr[j];
    22                 arr[j] = arr[i];
    23                 arr[i] = t;
    24             }
    25         }
    26         //最后将基准为与i和j相等位置的数字交换
    27         arr[left] = arr[i];
    28         arr[i] = temp;
    29         //递归调用左半数组
    30         sort(arr, left, j-1);
    31         //递归调用右半数组
    32         sort(arr, j+1, right);
    33     }

    用下面这段代码做测试,每个算法的大概时间(因个人电脑差异,数据可能有差异)

     1         Integer arr[] = new Integer[10000];
     2         for (int i =0;i<arr.length;i++){
     3             arr[i]= new Random().nextInt();
     4         }
     5         Long start = System.currentTimeMillis();
     6         sort(arr,0,arr.length-1);
     7         Long end = System.currentTimeMillis();
     8         System.out.println(start);
     9         System.out.println(end);
    10         System.out.println("运行时间为----"+(end-start));
    11         for (Integer i:arr) {
    12             System.out.print(i+" ");
    13         }

    冒泡算法:430~550ms

    简单选择排序:105~180ms

    直接插入排序:55~80ms

    希尔排序:40~60ms

    快速排序:5~10ms

  • 相关阅读:
    list与map的区别
    [BJOI2019]光线——递推
    [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
    [BJOI2019]送别——非旋转treap
    [BJOI2019]排兵布阵——分组背包
    [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
    BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
    BZOJ3033太鼓达人——哈密顿回路/欧拉回路
    BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
    BZOJ2339[HNOI2011]卡农——递推+组合数
  • 原文地址:https://www.cnblogs.com/shi-zhe/p/11910082.html
Copyright © 2011-2022 走看看