提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.冒泡排序
  • 2.选择排序
  • 3.插入排序
  • 4.希尔排序
  • 5.快速排序法
  • 6.归并排序
  • 7.堆排序

1.冒泡排序

基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),
依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐
向上冒。

下面展示一些 代码

public static void bubbleSort(int[] arr) {// 冒泡排序 的时间复杂度 O(n^2), 自己写出int temp = 0; // 临时变量boolean flag = false; // 标识变量,表示是否进行过交换for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {// 如果前面的数比后面的数大,则交换if (arr[j] > arr[j + 1]) {flag = true;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}//System.out.println("第" + (i + 1) + "趟排序后的数组");//System.out.println(Arrays.toString(arr));if (!flag) { // 在一趟排序中,一次交换都没有发生过break;} else {flag = false; // 重置flag!!!, 进行下次判断}}}

2.选择排序

基本介绍
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。

选择排序思想:

选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

代码如下(示例):

//选择排序public static void selectSort(int[] arr) {//选择排序时间复杂度是 O(n^2)for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;int min = arr[i];for (int j = i + 1; j < arr.length; j++) {if (min > arr[j]) { // 说明假定的最小值,并不是最小min = arr[j]; // 重置minminIndex = j; // 重置minIndex}}// 将最小值,放在arr[0], 即交换if (minIndex != i) {arr[minIndex] = arr[i];arr[i] = min;}}

3.插入排序

插入排序法介绍:

插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

插入排序法思想:

插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

代码如下(示例):

//插入排序public static void insertSort(int[] arr) {int insertVal = 0;int insertIndex = 0;for(int i = 1; i < arr.length; i++) {//定义待插入的数insertVal = arr[i];insertIndex = i - 1; // 即arr[1]的前面这个数的下标// 给insertVal 找到插入的位置// 说明// 1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界// 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置// 3. 就需要将 arr[insertIndex] 后移while (insertIndex >= 0 && insertVal < arr[insertIndex]) {arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]insertIndex--;}// 当退出while循环时,说明插入的位置找到, insertIndex + 1// 举例:理解不了,我们一会 debug//这里我们判断是否需要赋值if(insertIndex + 1 != i) {arr[insertIndex + 1] = insertVal;}//System.out.println("第"+i+"轮插入");//System.out.println(Arrays.toString(arr));}

4.希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

希尔排序法基本思想

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

代码如下:

public static void shellSort(int[] arr) {int temp = 0;int count = 0;// 根据前面的逐步分析,使用循环处理for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {// 遍历各组中所有的元素(共gap组,每组有个元素), 步长gapfor (int j = i - gap; j >= 0; j -= gap) {// 如果当前元素大于加上步长后的那个元素,说明交换if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}//System.out.println("希尔排序第" + (++count) + "轮 =" + Arrays.toString(arr));}
//对交换式的希尔排序进行优化->移位法
public static void shellSort2(int[] arr) {// 增量gap, 并逐步的缩小增量for (int gap = arr.length / 2; gap > 0; gap /= 2) {// 从第gap个元素,逐个对其所在的组进行直接插入排序for (int i = gap; i < arr.length; i++) {int j = i;int temp = arr[j];if (arr[j] < arr[j - gap]) {while (j - gap >= 0 && temp < arr[j - gap]) {//移动arr[j] = arr[j - gap];j -= gap;}//当退出while后,就给temp找到插入的位置arr[j] = temp;}}}
}

5.快速排序法

快速排序法介绍:

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

public static void quickSort(int[] arr,int left, int right) {int l = left; //左下标int r = right; //右下标//pivot 中轴值int pivot = arr[(left + right) / 2];int temp = 0; //临时变量,作为交换时使用//while循环的目的是让比pivot 值小放到左边//比pivot 值大放到右边while( l < r) { //在pivot的左边一直找,找到大于等于pivot值,才退出while( arr[l] < pivot) {l += 1;}//在pivot的右边一直找,找到小于等于pivot值,才退出while(arr[r] > pivot) {r -= 1;}//如果l >= r说明pivot 的左右两的值,已经按照左边全部是//小于等于pivot值,右边全部是大于等于pivot值if( l >= r) {break;}//交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交换完后,发现这个arr[l] == pivot值 相等 r--, 前移if(arr[l] == pivot) {r -= 1;}//如果交换完后,发现这个arr[r] == pivot值 相等 l++, 后移if(arr[r] == pivot) {l += 1;}}// 如果 l == r, 必须l++, r--, 否则为出现栈溢出if (l == r) {l += 1;r -= 1;}//向左递归if(left < r) {quickSort(arr, left, r);}//向右递归if(right > l) {quickSort(arr, l, right);}}

看起来比较整洁

 //快速排序public static void  quitSort(int []arr){quictRang(arr,0,arr.length-1);}private static void quictRang(int []arr,int from, int to){if (to-from+1<=1){//说明元素为1不需要排序return;}int priority=quit(arr,from,to);quictRang(arr,from,priority-1);// 针对小于等于 pivot 的区间做处理quictRang(arr,priority+1,to); // 针对大于等于 pivot 的区间做处理}//private static int quit(int []arr,int from,int to){// [from, left)   都是 <= pivot 的// [left, right)  都是未参与比较的// [right, to]    都是 >= pivot 的int pivot=arr[to];int left=from;int rigth=to;while (left<rigth){while (left<rigth && arr [left]<=pivot){left++;}while (left<rigth && arr[rigth]>=pivot){rigth--;}swaq(arr,left,rigth);//说明left下标处的指大于pivot与交换rigth交换}// 说明 left == right,说明 [left, right) 区间内一个元素都没有了// 所有元素都和 pivot 进行过比较了,然后都在各自应该的位置上了// 并且 array[left] 一定是 >= pivot 的第一个元素swaq(arr,to,left);return left;}private static   void  swaq(int[] arry, int i, int j) {int t=arry[i];arry[i]=arry[j];arry[j]=t;}

6.归并排序

归并排序介绍:

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

public static void mergeSort(int[] arr, int left, int right, int[] temp) {if(left < right) {int mid = (left + right) / 2; //中间索引//向左递归进行分解mergeSort(arr, left, mid, temp);//向右递归进行分解mergeSort(arr, mid + 1, right, temp);//合并merge(arr, left, mid, right, temp);}}//合并的方法/*** * @param arr 排序的原始数组* @param left 左边有序序列的初始索引* @param mid 中间索引* @param right 右边索引* @param temp 做中转的数组*/public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left; // 初始化i, 左边有序序列的初始索引int j = mid + 1; //初始化j, 右边有序序列的初始索引int t = 0; // 指向temp数组的当前索引//(一)//先把左右两边(有序)的数据按照规则填充到temp数组//直到左右两边的有序序列,有一边处理完毕为止while (i <= mid && j <= right) {//继续//如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素//即将左边的当前元素,填充到 temp数组 //然后 t++, i++if(arr[i] <= arr[j]) {temp[t] = arr[i];t += 1;i += 1;} else { //反之,将右边有序序列的当前元素,填充到temp数组temp[t] = arr[j];t += 1;j += 1;}}//(二)//把有剩余数据的一边的数据依次全部填充到tempwhile( i <= mid) { //左边的有序序列还有剩余的元素,就全部填充到temptemp[t] = arr[i];t += 1;i += 1;  }while( j <= right) { //右边的有序序列还有剩余的元素,就全部填充到temptemp[t] = arr[j];t += 1;j += 1;    }//(三)//将temp数组的元素拷贝到arr//注意,并不是每次都拷贝所有t = 0;int tempLeft = left; // //第一次合并 tempLeft = 0 , right = 1 //  tempLeft = 2  right = 3 // tL=0 ri=3//最后一次 tempLeft = 0  right = 7while(tempLeft <= right) { arr[tempLeft] = temp[t];t += 1;tempLeft += 1;}}

7.堆排序

基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的 数。
注意: 排升序要建大堆;排降序要建小堆。

//堆排序public static void heapSort(int []arr){greatHeap(arr);for (int i=0;i<arr.length-1;i++){swaq(arr,0,arr.length-i-1);shiftDown(arr,arr.length-1-i,0);}System.out.println(Arrays.toString(arr));}//建大堆private static void greatHeap(int []arr){for (int i=(arr.length-2)/2;i>=0;i--){shiftDown(arr,arr.length,i);}}//向下调整;private static void shiftDown(int[] arr, int size, int index) {while (index*2+1<size){int indexMax=index*2+1;int rigthIndex=index*2+2;if (rigthIndex<size&&arr[rigthIndex]>arr[indexMax]){indexMax=rigthIndex;}if (arr[index]>=arr[indexMax]){return;}swaq(arr,index,indexMax);index=indexMax;}}private static   void  swaq(int[] arry, int i, int j) {int t=arry[i];arry[i]=arry[j];arry[j]=t;}

数据结构中常用的7种排序方法相关推荐

  1. C语言常用8种排序方法耗时测试

    最近项目中用到排序算法,于是研究了一下常用的8种排序算法.由于是在8位单片机上使用,所以对内存和时间要求比较高,最好是不额外占空间,同时耗时较短.于是对常用的8中算法耗时做了个测试.通过LED的亮灭来 ...

  2. 郑州尚学堂:JAVA常用4种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 当然 程序中最简单的使用就是:快速排序和冒泡排序,插入排序的使用更具有技巧性,选择排序则过于复杂,冗杂 ...

  3. Excel中数据汇总常用的几种方法,sumif、合并计算、数据透视表

    Excel中数据汇总常用的几种方法: 如图,我们想要求出每个人的数量是多少,可以用3种方法. 第一种: 函数sumif(),首先把名字列出来,可以用删除重复项,其次在名字的后面用=sumif()来实现 ...

  4. 常用的几种排序,卖菜的王婆已经学废了,你不来瞅瞅?

    常用的八种排序 1.冒泡排序 2.插入排序 3.希尔排序 4.选择排序 5.堆排序 6.快速排序(重要) 7.归并排序(重要) 8.计数排序 各种排序方式的复杂度及稳定性比较 对一个数组进行排序你该不 ...

  5. java中常用的几种排序算法--常见笔试面试

    转载:http://blog.csdn.net/ygc87/article/details/7208082 以下列出Java中常用的几种排序算法,只是简单实现了排序的功能,还有待改进,望指教(以下均假 ...

  6. php常用的四种排序算法

    纯当练习,高手请绕过.以一维数组为例. 1.插入排序 思想: 每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止. 示例: [初始关键字] [49 ...

  7. c语言几种排序方法的比较,基于C语言的几种排序方法比较.doc

    基于C语言的几种排序方法比较.doc 基于C语言的几种排序方法比较 [摘要]文章对c语言中的冒泡排序法.选择排序法.插入排序法进行比较讨论,以试图找出最佳排序方法. [关键词]c语言;排序方法;比较 ...

  8. python中常用的九种预处理方法

    本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardization or Mean Removal ...

  9. JMeter 常用的几种断言方法,你会几种呢?

    在使用Jmeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言.断言是在请求的返回层面增加一层判断机制.因为请求成功了,并不代表结果一定正确,因此需要判断机制提高测试准确性.本 ...

最新文章

  1. 点击form 表单中的button导致页面刷新问题
  2. azkaban 与 java任务_Azkaban的任务类型分析35:JavaProcessJob的执行
  3. mnist 0与mnist x 相互衰变半衰期汇总
  4. CSS添加多个背景图片
  5. kibana7.x操作
  6. 【译】 Stealing the funds of all HTC EXODUS 1 users (HTC 区块链钱包安全漏洞分析)
  7. spring中的监视器,过滤器,拦截器
  8. URL去重的几种方法
  9. java as uuid_java UUID 源码学习
  10. 解密NTFS下经EFS加密的文件
  11. 如何使用SAP Cloud for Customer里的Data Source
  12. python 工资管理软件_基于[Python]的员工管理系统
  13. 10年+SQL性能优化专家谈SQL等价改写核心思想
  14. python随机猜数字游戏_Python小游戏——猜数字教程(random库教程)
  15. P3388 【模板】割点(割顶)
  16. WEBPACK+ES6+REACT入门(1/7)-创建webpack4.x项目
  17. 2021年网络工程师中级考点笔记
  18. std::set用法
  19. win10正式版新功能介绍
  20. 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法

热门文章

  1. 画论69 汪之元《天下有山堂画艺》
  2. 第一个小游戏“三子棋”超详细
  3. DNS中的正向解析与反向解析
  4. 高手最爱的5大沟通技巧,管下属、谈客户都能用得上
  5. html静态网站基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)...
  6. N诺刷题(基础算法)
  7. 多种方法清理电脑内存,解决电脑卡问题
  8. 年轻的时候应该去远方漂泊(转)
  9. Linux 安装FastDFS 图解教程
  10. 钕铁硼磁铁(NdFeB MAGNET)生产工艺流程