常见排序算法的复杂度

一.冒泡排序

1.时间复杂度为O(n^2)。
2.基本思路:

 第一趟:依次比较0和1、1和2、2和3…n-2和n-1索引的元素。如果发现第一个数据大于后一个数据,交换它们,经过第一趟,最大的元素排到了最后。

 第二趟:依次比较0和1,1和2、2和3…n-3和n-2索引的元素,如果发现第一个数据大于后一个数据,交换它们,经过第2趟,第2大的元素排到了倒数第2位。

第n-1趟:依次比较0和1元素,如果发现第一个数据大于后一个数据,交换它们,经过第n-1趟,第2小(第n-1大)的元素排到了第2位。

3.例子:9,16,27,23,30,49,21,35

第一趟:9比16小,则不交换,16小于27不交换,27大于23则交换,此时变成9,16,23,27,30,49,21,35。接着27小于30,不交换。30小于49,不交换。49大于 21交换。此时顺序变成了9,16,23,27,30,21,49,35。49大于35,则交换。此时顺序变成9,16,23,27,30,21,35,49。第一趟排序结束,最大数49在最后面。
第二趟:由9到30都是前面小于后面则不交换,到30和21位置,30大于21,交换。此时顺序,9,16,23,27,21,30,35,49. 30小于35,不再交换。第二趟结束。
第三趟:9,16,23,21,27,30,35,49
第四趟:9,16,21,23,27,30,35,49
package B;/*** Created by LiuSitong on 2017/3/9.*/
public class BubbleSort
{public void bubbleSort(int a[]){boolean flag = false;for (int i=0;i<a.length-1;i++){for (int j=0;j<a.length-1-i;j++ ){  //a.length-1-i 表示已经比较过的就不用再比较了//两个数进行交换int temp = 0;if (a[j]>a[j+1]){   //如果前一个数大于后一个数就交换temp = a[j + 1];a[j + 1] = a[j];a[j] = temp;flag = true;}}if (!flag){break;}}}public static void main(String[] args) {int [] a  = {9,16,27,23,30,49,21,35};BubbleSort b = new BubbleSort();b.bubbleSort(a);for (int aa : a){System.out.print(aa+",");}}}

二.快排

1.时间复杂度:O(nlgn)

2.快排思想是来自冒泡排序,冒泡排序是通过相邻元素的比较和交换把最小的冒泡到最顶端,而快速排序是比较和交换小数和大数,这样一来不仅把小数冒泡到上面同时也把大数沉到下面。

3.基本思路:

    第一步:设置两个变量I、J,排序开始的时候I=0,J=N(数组的最大索引号);

    第二步:以第一个数组元素作为关键数据,赋值给X,即X=A[0];

    第三步:从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,两者交换;

    第四步:从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,两者交换;

    第五步:重复第3、4步,直到I=J;

4.例子:49 38 65 97 76 13 27  (升序排列)

以49为关键数据,开始从后面开始找 小于49 则交换   现在顺序是27 38 65 97 76 13 49 。交换后从前面往后找比49大的数,49 和65 交换 。然后再次从后面找,以次规律循环  当i == j时候 停止。第一次查找结束。

   第一次排序后,进行一次划分为  【27 38 13】 49 【76 97 65】

   最后结果:13,27,38,49,65,76,97

package B;/*** Created by LiuSitong on 2017/3/9.*/
public class QuickSort {public void  quickSort(int []data,int left,int right){int i = left;int j = right;if (i >= j){   //判断是否到了中间,到了中间就返回return;}boolean flag=true; //false:左->右  true:右->左while (i != j) { //如果i==j证明第一趟结束,每趟的标准值仅是一个,例如第一趟被比较值为49,if (data[i] > data[j]) {//交换数字 :所有比它小的数据元素一律放到左边,所有比他大的数据元素一律放到右边,int temp = data[i];data[i] = data[j];data[j] = temp;//只有经过数的交换后,才能把游标的移动位置改变,移动书序是交替改变//决定下标移动,还是上标移动 ,游标更改 走下一个数据// flag = (flag == true) ? false : true;flag=!flag;}//将指针向前或者向后移动 ,第一次从左-》右,第二次从右-》左if(flag) {//true,右---》左j--;}else{//false 左---》右i++;}} //1 2//到此,数组的数据排列位置为://第一次到该位置,data的值是:[27, 38, 13, 49, 76, 97, 65]//将数组分开两半,确定每个数字的正确位置//i=3,j=3i--; //
        j++;//i=2 j=4 start=0 end=6quickSort(data, left, i); //也就是 27 38 13在快速排序quickSort(data, j, right); // 也就是 76, 97, 65在快速排序
    }public static void main(String[] args) {int [] a = {49,38,65,97,76,13,27};QuickSort q = new QuickSort();q.quickSort(a,0,a.length-1);for (int aa: a) {System.out.printf(aa+",");}}
}

转载于:https://www.cnblogs.com/SitongLiu/p/6527613.html

常用排序算法总结(一)相关推荐

  1. 常用排序算法对比(时间复杂度、稳定性)

    常用排序算法对比

  2. 视觉直观感受7种常用排序算法

    视觉直观感受若干常用排序算法 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状 ...

  3. C++STL常用排序算法

    C++STL常用排序算法 学习目标 算法简介 sort 功能描述 函数原型 示例 总结 random_shuffle 功能描述 函数原型 示例 总结 merge 功能描述 函数原型 示例 总结 rev ...

  4. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  5. java 性能 排序_Java常用排序算法及性能测试集合

    package algorithm.sort; import java.lang.reflect.Method; import java.util.Arrays; import java.util.D ...

  6. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

  7. [转载] java实现四种常用排序算法

    参考链接: 用Java排序 四种常用排序算法 ##注:从小到大排 ##冒泡排序## 特点:效率低,实现简单 思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有 ...

  8. Visual C# 诠释常用排序算法

    Visual C# 诠释常用排序算法 前段时间因为项目需要,做了个用来对数组排序的类,顺便把以前学过的几种排序算法用C#实现一下.用C#的一些机制来诠释了一下算法的是实现.在阅读本之前,需要一些对C# ...

  9. 各种常用排序算法的时间复杂度和空间复杂度

    https://blog.csdn.net/jiajing_guo/article/details/69388331 一.常用排序算法的时间复杂度和空间复杂度表格 二.特点 1.归并排序: (1)n大 ...

  10. Unity3D教程:手游开发常用排序算法 -下

    五.堆排序(Heap Sort) 1. 基本思想: 堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小 ...

最新文章

  1. 华为昇腾AI全栈知识深入解读,师资培训沙龙深圳场圆满落幕!
  2. Exchange2013公用文件夹
  3. Undefined exploded archive location Tomcat之项目不能发布
  4. vb如何定义微软服务器stul,VBScrip微软官方教程.doc
  5. 美国款游戏计算机,美国一程序员设计计算机游戏 悼念早逝爱子(图)
  6. 研究cegui,写脚本
  7. java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能
  8. VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法
  9. 通过埋点搜集日志数据的简单架构
  10. 硬件时序图软件——TimeGen_v3.3
  11. 超全的网络安全精编自学资料合集(64份)
  12. 服务端渲染SSR及实现原理
  13. 惊呆了,Java居然已经内卷成菜花啦。
  14. html自动缩放不出现滚动条,HTML页面缩小后显示滚动条的示例代码
  15. “办公自动化(OA)系统解决方案集”上线
  16. 考研数学-基础阶段几何串讲1主讲人:王淳 -2020年06月26日
  17. DataRow.Field Expression [DataTable动态linq]
  18. 使用FullCalendar做一个自己的日程管理(二)- 事件篇
  19. anycast隧道_隧道服务器是什么意思
  20. IT专业技术人员学习网站整理

热门文章

  1. C++ 练习题(二)计算机存储和数字系统介绍
  2. C++ 练习题(一:布尔表达式与真值表图文详解)
  3. 使用tcpdump抓包工具来捕捉三次握手和四次挥手
  4. HDOJ--1596--find the safest road
  5. 经典股票图形:蛟龙出海
  6. Ubuntu固定ip和dns配置和查看
  7. 高性能计算多集群管理平台
  8. matlab 自带例子,matlab自带各种分类器的使用示例
  9. Mac OS X 安装protobuf
  10. 计算机专业选电科还是华科,西交、华科与两电一邮:5所高校怎么选?工科选西交,学IT选北邮...