博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见排序算法
阅读量:6390 次
发布时间:2019-06-23

本文共 2836 字,大约阅读时间需要 9 分钟。

  hot3.png

1、直接插入排序

描述:

对于给定的一个数组,初始时假设第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止。

特点:

平均O(n^2),最好O(n),最坏O(n^2);空间复杂度O(1);稳定;简单

代码实现:

public class InsertionSort {  public static void insertionSort(int[] a) {    int tmp;    for (int i = 1; i < a.length; i++) {      for (int j = i; j > 0; j--) {        if (a[j] < a[j - 1]) {          tmp = a[j - 1];          a[j - 1] = a[j];          a[j] = tmp;        }      }    }  }}

2、希尔排序

描述:

先将待排序序列的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序。

特点:

平均O(nlogn),最坏O(nlogn);空间复杂度O(1);不稳定;较复杂

代码实现:

public class ShellSort {  public static void shellSort(int[] a) {    int n = a.length;    int d = n / 2;    while (d > 0) {      for (int i = d; i < n; i++) {        int j = i - d;        while (j >= 0 && a[j] > a[j + d]) {          int tmp = a[j];          a[j] = a[j + d];          a[j + d] = tmp;          j = j - d;        }      }      d = d / 2;    }  }}

3、冒泡排序

描述:

对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和交换后,n个记录中的最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个为止。

特点:

平均O(n^2),最好O(n),最坏O(n^2);空间复杂度O(1);稳定

代码实现:

public class BubbleSort {  public static void bubbleSort(int[] a) {    int n = a.length;    int temp = 0;    for (int i = 0; i < n; i++) {      for (int j = 0; j < n - i - 1; j++) {        if (a[j] < a[j + 1]) {          temp = a[j];          a[j] = a[j + 1];          a[j + 1] = temp;        }      }    }  }}

4、快速排序

描述:

对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。

特点:

平均O(nlogn),最好O(nlogn),最坏O(n^2);空间复杂度O(nlogn);不稳定;较复杂

代码实现:

public class QuickSort {    public static int sort(int[] array, int lo, int hi) {    //固定的切分方式    int key = array[lo];    while (lo < hi) {      while (array[hi] >= key && hi > lo) {//从后半部分向前扫描        hi--;      }      array[lo] = array[hi];      while (array[lo] <= key && hi > lo) {//从前半部分向后扫描        lo++;      }      array[hi] = array[lo];    }    array[hi] = key;    return hi;  }  public static void quickSort(int[] array, int lo, int hi) {    if (lo >= hi) {      return;    }    int index = sort(array, lo, hi);    sort(array, lo, index - 1);    sort(array, index + 1, hi);  }}

5、选择排序

描述:

对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。

特点:

平均O(n^2),最好O(n^2),最坏O(n^2);空间复杂度O(1);不稳定;简单

代码实现:

public class SelectionSort {  public static void selectionSort(int[] a) {    int n = a.length;    for (int i = 0; i < n; i++) {      int k = i;      // 找出最小值的小标      for (int j = i + 1; j < n; j++) {        if (a[j] < a[k]) {          k = j;        }      }      // 将最小值放到排序序列末尾      if (k > i) {        int tmp = a[i];        a[i] = a[k];        a[k] = tmp;      }    }  }}

6、堆排序

待补

7、归并排序

待补

 

转载于:https://my.oschina.net/jzgycq/blog/1595085

你可能感兴趣的文章
函数和闭包之头等函数
查看>>
三: cocos2d-x代码分析
查看>>
转-linux系统脚本 环境变量 的启动顺序
查看>>
我的友情链接
查看>>
My blog please navigate to http://hi.baidu.com/248828412
查看>>
spring in action 4 第5章
查看>>
sed用法整理
查看>>
Weblogic 前端热部署
查看>>
zimba安装
查看>>
F5内网大二层负载均衡业务访问故障解析(CISCO OTV+LISP-MTU问题导致)
查看>>
有一种失败叫瞎忙
查看>>
Linux——文件管理之inode
查看>>
nginx反向代理,实现负载均衡
查看>>
IDEA 13 tomcat 进行远程调试
查看>>
Successor,Fesible Successor,FD,AD,eigrp
查看>>
仿百度GIF验证码 GIFEncoder 跳动验证码 随机背景色、颜色、字体、子大小、偏移、干扰线等...
查看>>
值得学习的寓言故事和哲理
查看>>
静态路由中使用一跳和出接口的区别
查看>>
ARM1176JZF-S/S3C6410处理器的操作模式和寄存器
查看>>
centos 编译安装mysql
查看>>