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

    ---------------------------稳定的

    --------------------------------------------------------------冒泡算法

     1 /**
     2  * 冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
     3  * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 
     4  * 针对所有的元素重复以上的步骤,除了最后一个。
     5  * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
     6  * @param arr int[] 需要排序的数组
     7  * @return arr排序完成的数据
     8  */
     9 public int[] sort(int[] arr) {
    10     int temp = 0;
    11     for (int i = arr.length - 1; i > 0; --i) {
    12         for (int j = 0; j < i; ++j) {//从开始第一对到结尾的最后一对
    13             if (arr[j] > arr[j + 1]) {
    14                 temp = arr[j];
    15                 arr[j] = arr[j + 1];
    16                 arr[j + 1] = temp;
    17             }
    18         }
    19     }
    20     return arr;
    21 }

    -------------------------------------------------------------------直接插入排序

     1 /**
     2  * 直接插入排序
     3  * (1)设置监视哨r[0],将待插入纪录的值赋值给r[0]; 
     4  * (2)设置开始查找的位置j; 
     5  * (3)在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止; 
     6  * (4)将r[0]插入r[j+1]的位置上。
     7  * @param arr 需要排序的数组
     8  * @return 排序完成的数组
     9  */
    10 public int[] sort(int[] arr) {
    11     for (int i = 1; i < arr.length; i++) {
    12         int temp = arr[i];
    13         int j = i-1;
    14         for (; j >= 0; j--) {
    15             if(temp<arr[j]) {
    16                 arr[j+1] = arr[j];
    17             } else {
    18                 break;
    19             }
    20         }
    21         arr[j+1] = temp;
    22     }
    23     return arr;
    24 }

    -----------------------------------------------------------------------二分插入排序(折半插入排序)

     1 /**
     2  * 折半排序算法 
     3  * 在将一个新元素插入已排好序的数组的过程中,寻找插入点时, 将待插入区域的首元素设置为a[low],末元素设置为a[high],
     4  * 则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,
     5  * 如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high
     6  * =m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),
     7  * 如此直至low<=high不成立,即将此位置之后所有元素后移一位 ,并将新元素插入a[high+1]。
     8  * @param arr 需要排序的数组
     9  * @return 排序完成的数组
    10  * ?如果是递归应该怎么做?
    11  */
    12 public int[] sort(int[] arr) {
    13     for (int i = 1; i < arr.length; i++) {
    14         int temp = arr[i];
    15         int low = 0;
    16         int high = i - 1;
    17         while (low <= high) {
    18             int mid = (low + high) / 2;
    19             if (temp < arr[mid]) {
    20                 high = mid - 1;
    21             } else {
    22                 low = mid + 1;
    23             }
    24         }
    25         for (int j = i; j >= low + 1; j--) {
    26             arr[j] = arr[j - 1];
    27         }
    28         arr[high+1] = temp;
    29     }
    30     return arr;
    31 }

    -----------------------不稳定的

    --------------------------------------------------------------------------选择排序

     1 /**
     2  * 选择排序
     3  * 对着一群数组说,你们谁最小出列,站到最后边
     4  * 然后继续对剩余的无序数组说,你们谁最小出列,站到最前边
     5  * 再继续刚才的操作,一直到最后一个,继续站到最前边,现在数组有序了,从小到大
     6  * @param arr 需要排序的数组
     7  * @return 排序完成的数组
     8  */
     9 public int[] sort(int[] arr) {
    10     int minIndex = 0;
    11     int temp = 0;
    12     for (int i = 0; i < arr.length - 1; i++) {
    13         minIndex = i;// 无序区的最小数据数组下标
    14         for (int j = i + 1; j < arr.length; j++) {
    15             // 在无序区中找到最小数据并保存其数组下标
    16             if (arr[j] < arr[minIndex]) {
    17                 minIndex = j;
    18             }
    19         }
    20         if (minIndex != i) {
    21             // 如果不是无序区的最小值位置不是默认的第一个数据,则交换之。
    22             temp = arr[i];
    23             arr[i] = arr[minIndex];
    24             arr[minIndex] = temp;
    25         }
    26     }
    27     return arr;
    28 }

    --------------------------------------------------------------------------希尔排序

     1 /**
     2  * 希尔排序 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。
     3  * 先在各组内进行直接插入排序;然后,取第二个增量d2=d1-1重复上述的分组和排序,直至所取的增量 =1,
     4  * 即所有记录放在同一组中进行直接插入排序为止。
     5  * @param arr 需要排序的数组
     6  * @return 排序完成的数组
     7  */
     8 public int[] sort(int[] arr) {
     9     int d = arr.length / 2;
    10     while (true) {
    11         for (int i = 0; i < d; i++) {// 分成几组,循环几次
    12             for (int j = i; j + d < arr.length; j += d) {// 组内成员两两比较,从小到大排列
    13                 int temp;
    14                 if (arr[j] > arr[j + d]) {
    15                     temp = arr[j];
    16                     arr[j] = arr[j + d];
    17                     arr[j + d] = temp;
    18                 }
    19             }
    20         }
    21         if (d == 1) {
    22             break;
    23         }
    24         d--;
    25     }
    26     return arr;
    27 }

    --------------------------------------------------------------------------快速排序

     1 /**
     2  * 1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
     3  * 2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
     4  * 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
     5  * 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
     6  * @param arr 需要排序的数组
     7  * @param low 首元素
     8  * @param high 末元素
     9  * @return 排序完成的数组
    10  */
    11 public int[] sort(int[] arr, int l, int r) {
    12     if (l < r) {
    13         int i = l, j = r, x = arr[l];
    14         while (i < j) {
    15             while (i < j && arr[j] >= x)
    16                 // 从右向左找第一个小于x的数
    17                 j--;
    18             if (i < j)
    19                 arr[i++] = arr[j];
    20             while (i < j && arr[i] < x)
    21                 // 从左向右找第一个大于等于x的数
    22                 i++;
    23             if (i < j)
    24                 arr[j--] = arr[i];
    25         }
    26         arr[i] = x;
    27         arr = sort(arr, l, i - 1); // 递归调用
    28         arr = sort(arr, i + 1, r);
    29     }
    30     return arr;
    31 }

    --------------------------------------------------------------------------

  • 相关阅读:
    vue学习之五生命周期
    vue学习之四组件系统
    vue学习之三常用命令
    vue学习之二ECMAScript6标准
    vue学习之一vue初识
    (转)nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
    python技巧总结之set、日志、rsa加密
    (转)二十三种设计模式及其python实现
    Python之traceback错误堆栈信息处理
    python虚拟环境--virtualenv
  • 原文地址:https://www.cnblogs.com/xkk112/p/4777986.html
Copyright © 2011-2022 走看看