来源:https://www.cnblogs.com/wangmingshun/p/5635292.html

日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。

以下常见算法的定义

1. 插入排序:插入排序基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。2. 选择排序:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。3. 冒泡排序:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。4. 快速排序:快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。5. 归并排序:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。6. 希尔排序:希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

一、冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

/**  *  冒泡法排序   *  比较相邻的元素。如果第一个比第二个小,就交换他们两个。 *  对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最小的数。   *  针对所有的元素重复以上的步骤,除了最后一个。  *  持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 *   * @param numbers  *            需要排序的整型数组  */
public static void bubbleSort01(int[] numbers) {   int temp; // 记录临时中间值   int size = numbers.length; // 数组大小   for (int i = 0; i < size - 1; i++) {   for (int j = i + 1; j < size; j++) {   if (numbers[i] < numbers[j]) { // 交换两数的位置   temp = numbers[i];   numbers[i] = numbers[j];   numbers[j] = temp;   }   }   }
}

注意:以上不知是什么排序,将基准位置的元素和后面的元素进行比较,如果基准位置值比后面元素小,则交换位置,交换后的元素为新的基准元素。以下才是真正的冒泡排序。

public static void bubbleSort(int[] a) {int temp;int size = a.length;for(int i=1; i<size; i++) {for(int j=0; j<size-i; j++) {if(a[j] < a[j+1]) {temp = a[j];a[j]=a[j+1];a[j+1]=temp;}}for(int aa : a)System.out.print(aa+",");System.out.println();}
}

二、快速排序

快速排序使用分治法策略来把一个序列分为两个子序列。

/**  * 快速排序 *    *  从数列中挑出一个元素,称为“基准”  *  重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,  *  该基准是它的最后位置。这个称为分割(partition)操作。  *  递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。  *  * @param numbers  * @param start  * @param end  */
public static void quickSort(int[] numbers, int start, int end) {   if (start < end) {   int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)   int temp; // 记录临时中间值   int i = start, j = end;   do {   while ((numbers[i] < base) && (i < end))   i++;   while ((numbers[j] > base) && (j > start))   j--;   if (i <= j) {   temp = numbers[i];   numbers[i] = numbers[j];   numbers[j] = temp;   i++;   j--;   }   } while (i <= j);   if (start < j)   quickSort(numbers, start, j);   if (end > i)   quickSort(numbers, i, end);   }
}

如下为完全符合快速排序定义的算法:

public static void quickSort01(int[] a, int start, int end) {if(start >= end)return;int i = start;int j = end;int base = a[start];while(i != j) {while(a[j] >= base && j > i)j--;while(a[i] <= base && i < j)i++;if(i < j) {int temp = a[i];a[i] = a[j];a[j] = temp;}}a[start] = a[i];a[i] = base;te(a, start, i - 1);te(a, i + 1, end);
}

三、选择排序

选择排序是一种简单直观的排序方法,每次寻找序列中的最小值,然后放在最末尾的位置。

/**  * 选择排序* 在未排序序列中找到最小元素,存放到排序序列的起始位置  * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列起始位置。  * 以此类推,直到所有元素均排序完毕。  *   * @param numbers  */
public static void selectSort(int[] numbers) {   int size = numbers.length;int temp;   for (int i = 0; i < size; i++) {   int k = i;   for (int j = size - 1; j >i; j--)  {   if (numbers[j] < numbers[k]) {k = j;   }}   temp = numbers[i];   numbers[i] = numbers[k];   numbers[k] = temp;   }
}

四、插入排序

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。其具体步骤参见代码及注释。

/**  * 插入排序   *   *  从第一个元素开始,该元素可以认为已经被排序 *  取出下一个元素,在已经排序的元素序列中从后向前扫描  *  如果该元素(已排序)大于新元素,将该元素移到下一位置   *  重复步骤3,直到找到已排序的元素小于或者等于新元素的位置   *  将新元素插入到该位置中   *  重复步骤2    * @param numbers  */
public static void insertSort(int[] numbers) {   int size = numbers.length, temp, j;   for(int i=1; i<size; i++) {   temp = numbers[i];   for(j = i; j > 0 && temp < numbers[j-1]; j--)   numbers[j] = numbers[j-1];   numbers[j] = temp;   }
}

五、归并排序

归并排序是建立在归并操作上的一种有效的排序算法,归并是指将两个已经排序的序列合并成一个序列的操作。

/**  * 归并排序   *   *  申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 *  设定两个指针,最初位置分别为两个已经排序序列的起始位置   *  比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 *  重复步骤3直到某一指针达到序列尾   *  将另一序列剩下的所有元素直接复制到合并序列尾  *   * @param numbers  */
public static void mergeSort(int[] numbers, int left, int right) {   int t = 1;// 每组元素个数   int size = right - left + 1;   while (t < size) {   int s = t;// 本次循环每组元素个数   t = 2 * s;   int i = left;   while (i + (t - 1) < size) {   merge(numbers, i, i + (s - 1), i + (t - 1));   i += t;   }   if (i + (s - 1) < right)   merge(numbers, i, i + (s - 1), right);   }
}
/**  * 归并算法实现  *   * @param data  * @param p  * @param q  * @param r  */
private static void merge(int[] data, int p, int q, int r) {   int[] B = new int[data.length];   int s = p;   int t = q + 1;   int k = p;   while (s <= q && t <= r) {   if (data[s] <= data[t]) {   B[k] = data[s];   s++;   } else {   B[k] = data[t];   t++;   }   k++;   }   if (s == q + 1)   B[k++] = data[t++];   else  B[k++] = data[s++];   for (int i = p; i <= r; i++)   data[i] = B[i];
}

常见的排序算法及java实现相关推荐

  1. access两字段同时升序排序_7 天时间,我整理并实现了这 9 种常见的排序算法

    排序算法 回顾 我们前面已经介绍了 3 种最常见的排序算法: java 实现冒泡排序讲解 QuickSort 快速排序到底快在哪里? SelectionSort 选择排序算法详解(java 实现) 然 ...

  2. 各种排序算法的JAVA实现

    原文转自:http://blog.csdn.net/zhangerqing/article/details/8831542 本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们 ...

  3. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...

    史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ...

  4. 常用排序算法的Java实现 - 1

    学习编程语言时, 我们会接触到许多排序算法, 这里总结了一下常见的排序算法. 不定期更新. * 其实在Java中存在如Collections.sort()这样的方法来自动为我们排序, 不过学习排序算法 ...

  5. 七种常见的排序算法总结

    目录 引言 1.什么是排序? 2.排序算法的目的是什么? 3.常见的排序算法有哪些? 一,插入排序 1.基本思想 2.代码实现 3.性能分析 4.测试 二,希尔排序(缩小增量排序) 1.基本思想 2. ...

  6. 八大排序算法的java实现

    八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...

  7. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

  8. PHP面试题:请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。

    常见的排序算法: 冒泡排序法.快速排序法.简单选择排序法.堆排序法.直接插入排序法.希尔排序法.合并排序法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键 ...

  9. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang;import java.util.Arrays;/*** Created by admin on 2017/1/20.*/ p ...

最新文章

  1. 【C++】多线程(链式、循环队列)实现生产者消费者模式
  2. Asp.Net 学习资源列表
  3. 您现在只需免费与相机捆绑即可购买一个PSVR
  4. docker安装运行rancher脚本
  5. PPT图标的正确使用和插入与编辑形状
  6. 第四次博客作业:bookstore缺陷报告
  7. 游族网络回应被新浪财团收购:有相关计划 但对方身份尚不知情
  8. TopFreeTheme精选免费模板【20130617】
  9. Abaqus帮助文档翻译——Abaqus/CAE主窗口介绍
  10. mysql打开数据库命令_MySQL操作数据库指令
  11. 阿里云大数据ACP(三)可视化 Quick BI
  12. MATLAB的appdesigner背景图片设置
  13. html没有注册类,电脑中ie浏览器提示没有注册类别的三种解决方法
  14. 癌症/肿瘤免疫治疗最新研究进展(2022年4月)
  15. Rocketmq简介及部署、原理和使用介绍
  16. 机器人讯息合集:3D打印“元机器人”、水陆两用微机器人、会游泳的机械狗、“香蕉”软体机器人、无线两栖机器人
  17. SystemService简介
  18. python练习题——文件的打开、读取、复写
  19. UML建模(活动图状态图)
  20. antd table 超出显示省略号无效果

热门文章

  1. 【腾讯敏捷转型No.8】你爱上手机QQ了么?
  2. FullCalendar日历插件的简单使用(版本4.2.0)
  3. 03pe修改计算机名称,[U盘PE教程]玩转PE内置注册表(基于NT6.0)
  4. 引领行业革新:创维游戏装备S81 Pro重磅发布
  5. Android Studio 3.0后,找不到Launch Standalone SDK Manager
  6. 数据库的这些你都知道吗?
  7. 奔跑在爱情的高速路上
  8. Python学习笔记:第四站 往哪走
  9. 计算机组成原理——系统总线的特性及其应用
  10. Linux基本功十二:shell脚本流程控制