基本排序方法归纳整理(一):冒泡排序
来源:互联网 发布:mysql防止高并发 编辑:程序博客网 时间:2024/06/08 06:21
注:文章内容整理自《Data Structures and Algorithm Analysis in Java (Second Edition)》——Mark Allen Weiss
内部排序(internal sorting):在主存中即可完成的排序;
外部排序(external sorting):不能在主存中完成,必须借助外存(磁盘)
1、常见内部排序有7种:冒泡排序,插入排序,选择排序,希尔排序,堆排序,归并排序,快速排序
2、时间复杂度在O(N^2)的排序方法是冒泡排序,插入排序和选择排序;
“通过交换相邻元素进行排序的任何算法平均时间都需要O(N^2)”——书中定理7.2
时间复杂度比O(N^2)略优的排序算法希尔排序,恰恰是突破了定理7.2的限制才得以实现的,具体时间复杂度一句所选增量有较大变化,一般认为若增量序列选择合适(如Hibbard增量),希尔排序最坏时间复杂度为O(N^(3/2)),平均复杂度在O(N^(5/4)),若选择不合适,依然是O(N^2)
堆排序,归并排序,快速排序属于较快的排序方法,平均时间复杂度为O(NlogN)
(一)冒泡排序
- 冒泡排序简介
冒泡排序是最简单易懂的排序法,“冒泡”的由来就是自下向上,每次都将一个最小(或最大)元素升到最上端位置,就像水中“冒泡”一样(此节书中没有,个人整理)。 - 一趟冒泡:
示意图如下:
一趟排序中,逐个遍历,相邻元素判断是否交换(图中红色的代表是已发生过交换的数),最终在顶部“冒泡”出一个排序值(绿色),一趟排序只能定一个值,若要全部排序,则需要n趟冒泡,由于每趟需要比较n-1次,故最终时间复杂度为O(N^2) - 冒泡排序(n趟冒泡)
示意图如下: - java代码实现
public class BubbleSorting { /* * 1、每冒泡一趟,就将最大的元素放置到数组末尾(默认从小到大排序),一趟定出一个元素的位置 * 2、通过相邻元素(j与j+1)的比较,判断是否需要交换位置,将较大的放置到j+1的位置上,然后比较下一个相邻对 * 3、冒泡一趟定出一个较大值,下次冒泡时就仅需要比较剩余较小的值即可,即每次比较的总数会递减 * @param arr -->被排序数组 * @param */ public static void bubbleSort(int[] arr){ if(arr==null || arr.length==0){ return ; } for(int i=arr.length-1; i>0; i--){ //i计数当前需要进行排序的个数 for(int j=0; j<i; j++){ //j计数本次一趟冒泡中的下标计数 if(arr[j]>arr[j+1]){ //相邻对比较中,前者比后者大,则交换 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } public static void main(String[] args){// BubbleSorting bubble = new BubbleSorting(); int[] arr1 = {}; int[] arr2 = {5,7,3,8,2,9,4,5,5,3,6,8,8,2,1}; int[] arr3 = null; int[] arr4 = {9,8,7,6,5,4,3,2,1}; bubbleSort(arr1); bubbleSort(arr2); bubbleSort(arr3); bubbleSort(arr4); System.out.println("arr1:"+Arrays.toString(arr1)); System.out.println("arr2:"+Arrays.toString(arr2)); System.out.println("arr3:"+Arrays.toString(arr3)); System.out.println("arr4:"+Arrays.toString(arr4)); }}
显示结果为:
arr1:[]arr2:[1, 2, 2, 3, 3, 4, 5, 5, 5, 6, 7, 8, 8, 8, 9]arr3:nullarr4:[1, 2, 3, 4, 5, 6, 7, 8, 9]
- 总结
冒泡排序为O(N^2)算法,稳定排序
阅读全文
0 0
- 基本排序方法归纳整理(一):冒泡排序
- 基本排序方法归纳整理(二):插入排序
- java实现基本排序(一)冒泡排序
- 基本排序算法Java实现归纳(一)
- 排序(一) 冒泡排序
- 排序(一)冒泡排序
- 排序(一):冒泡排序
- 算法整理-排序(冒泡)
- 常见排序算法整理(一)----冒泡排序、直接插入排序
- 排序一 冒泡排序
- 排序一 冒泡排序
- 基本排序(冒泡排序,选择排序,插入排序)
- 基本排序算法(冒泡排序,选择排序,插入排序)
- Java基本排序(插入排序,冒泡排序,选择排序)
- javascript实现基本数据结构(一)冒泡排序
- java基本算法复习(一):冒泡排序
- 排序方法:冒泡排序
- 基本排序(一):冒泡排序算法的三种基本实现
- IE浏览器不支持JSON,显示undefined的错误
- 编译、链接学习笔记(四)进程装载
- java 构造函数默认修饰符
- 网易互娱2017笔试题----最大数
- LeetCode167.Two Sum II
- 基本排序方法归纳整理(一):冒泡排序
- 嵌入式系统基础
- eclipse搭建spring框架
- 欢迎使用CSDN-markdown编辑器
- 机器学习笔试题
- redis 与tomcat 的session 共享
- c++形参与实参
- 基于深度学习的命名实体识别详解(附Github代码)
- 常用的排序算法的时间复杂度和空间复杂度