zoukankan      html  css  js  c++  java
  • Java中的几种排序算法

    插入排序:自1开始,通过交换将i插入其左端的有序的数列中。 交换次数不确定,但比较次数较均衡。 比冒泡更优。

    1 private static void charu(int x[], int off, int len) {
    2         for (int i = off; i < len + off; i++)
    3             for (int j = i; j > off && x[j - 1] > x[j]; j--)
    4                 swap(x, j, j - 1);
    5     }

    选择排序:与冒泡相似,每一趟找到自i到末端最小的数的index,然后与i交换 一趟只需一次交换,所以比冒泡快。

     1 private static void xuanze(int x[], int off, int len) {
     2         for (int i = off; i < len + off; i++) {
     3             int min = i;
     4             for (int j = min; j < len + off; j++) {
     5                 if (x[min] > x[j])
     6                     min = j;
     7             }
     8             swap(x, i, min);
     9         }
    10     }

    冒泡排序:i从左至右,i定住时将自i到末端最小的数移至i处,完成一趟,以此类推直至i到最右端 通过不停交换完成,时间消耗较多。

    1 private static void maopao(int x[], int off, int len) {
    2         for (int i = off; i < len + off - 1; i++) {
    3             for (int j = i; j < len + off; j++) {
    4                 if (x[i] > x[j])
    5                     swap(x, i, j);
    6             }
    7         }
    8     }

    快速排序法:首先任意选取一个数据作为关键数据,然后将所有比它小的数都放到它前面, 所有比它大的数都放到它后面,这个过程称为一趟快速排序。之后递归。

                     算法: 1)i从左到右找比key大的,i移至此处;j从右到左找比key小的,j移至此处

                               2)若i<j则交换ij,重复1);否则,一趟完成

                               3)一趟完成之后i如果未到最右端,递归右端;j如果未到达最左端,递归左端 此算法可改进,请参详jdk源码。

     1 private static void kuaisu(int x[], int off, int len) {
     2         int m = off + (len >> 1); // 中位下标
     3         int left = off;// 起始下标
     4         int right = off + len - 1;// 结束下标
     5         m = med3(x, left, m, right);
     6         int key = x[m];// 取中间的那个作为关键数据
     7         // System.out.println("key="+key);
     8         int i = left;
     9         int j = right;
    10         while (true) {
    11             while ((x[i] < key) && (i < right))
    12                 // 从左到右找>=的
    13                 i++;
    14             while ((x[j] > key) && (j > left))
    15                 // 从右到左找<=的
    16                 j--;
    17             if (i >= j) {
    18                 break;// 一趟完成
    19             }
    20             swap(x, i, j);
    21             System.out.printf("swap %d %d:%s
    ", i, j, Arrays.toString(x));
    22         }
    23         if (i < right)
    24             kuaisu(x, i + 1, right - i);
    25         if (j > left)
    26             kuaisu(x, left, j - left);
    27     }


    求数值处于中间的下标:

    1 private static int med3(int x[], int a, int b, int c) {
    2         return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a)
    3                 : (x[b] > x[c] ? b : x[a] > x[c] ? c : a));
    4     }

    在数组x中交换a b位置:

    1 private static void swap(int x[], int a, int b) {
    2         int t = x[a];
    3         x[a] = x[b];
    4         x[b] = t;
    5     }
  • 相关阅读:
    SpringBoot返回json和xml
    Spring boot 集成MQ
    Spring boot freemarker 配置
    Spring boot 自定义注解标签记录系统访问日志
    RIDE对应驱动下载
    在线修改pdf识别图片
    记公司食堂收厨余垃圾的人
    [Ruby]使用Ruby抓取网页及加工处理
    [转载]SCSS 和 SASS 和 HAML 和CoffeeScript
    [ACM]反复平方法的两种写法
  • 原文地址:https://www.cnblogs.com/qwmzjn/p/5853697.html
Copyright © 2011-2022 走看看