冒泡排序、选择排序、直接插入排序

冒泡排序

比较相邻的元素,如果第一个比第二个大,就交换他们。第一步所有相邻的排序做完后,最大的数字会在最右边,接着重复步骤。

public class Main {

    public static void main(String[] args) {        int[] array={9,5,2,6,1,3,8,4,10,7};        for (int i=0;i<array.length;i++){            for (int j=0;j<array.length-i-1;j++){                if (array[j]>array[j+1]){                    int number=array[j];                    array[j]=array[j+1];                    array[j+1]=number;

                }

            }        }

        for (int number:array){            System.out.println(number);        }    }}

控制台输出:12345678910

 假设参与比较的数组元素个数为 N,则第一轮排序有 N-1 次比较,第二轮有 N-2 次,如此类推,这种序列的求和公式为:


  (N-1)+(N-2)+...+1 = N*(N-1)/2

当 N 的值很大时,算法比较次数约为 N2/2次比较,忽略减1。

 假设数据是随机的,那么每次比较可能要交换位置,可能不会交换,假设概率为50%,那么交换次数为 N2/4。不过如果是最坏的情况,初始数据是逆序的,那么每次比较都要交换位置。

  交换和比较次数都和N2 成正比。由于常数不算大 O 表示法中,忽略 2 和 4,那么冒泡排序运行都需要 O(N2) 时间级别。

  其实无论何时,只要看见一个循环嵌套在另一个循环中,我们都可以怀疑这个算法的运行时间为 O(N2)级,外层循环执行 N 次,内层循环对每一次外层循环都执行N次(或者几分之N次)。这就意味着大约需要执行N2次某个基本操作。

选择排序

选择排序是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。


public class Main {

    public static void main(String[] args) {        int[] array={9,5,2,6,1,3,8,4,10,7};       for (int i=0;i<array.length-1;i++){           int min=i;           for (int j=i+1;j<array.length;j++){               if (array[j]<array[i]) {                   min=j;                   if (i!=j){                       int number=array[i];                       array[i]=array[min];                       array[min]=number;                   }               }           }       }

        for (int number:array){            System.out.println(number);        }    }}

控制台输出:12345678910
 

选择排序和冒泡排序执行了相同次数的比较:N*(N-1)/2,但是至多只进行了N次交换。


  当 N 值很大时,比较次数是主要的,所以和冒泡排序一样,用大O表示是O(N2) 时间级别。但是由于选择排序交换的次数少,所以选择排序无疑是比冒泡排序快的。当 N 值较小时,如果交换时间比比较时间大的多,那么选择排序是相当快的。

直接插入排序


插入排序是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。


public class Main {

    public static void main(String[] args) {        int[] array = {9, 5, 2, 6, 1, 3, 8, 4, 10, 7};      int j;

     for (int i=1;i<array.length;i++){         int number=array[i];         j=i;         while (j>0&&number<array[j-1]){             array[j]=array[j-1];             j--;         }         array[j]=number;     }

        for (int number : array) {            System.out.println(number);        }

    }}

控制台输出:12345678910

 在第一轮排序中,它最多比较一次,第二轮最多比较两次,一次类推,第N轮,最多比较N-1次。因此有 1+2+3+...+N-1 = N*(N-1)/2。

  假设在每一轮排序发现插入点时,平均只有全体数据项的一半真的进行了比较,我们除以2得到:N*(N-1)/4。用大O表示法大致需要需要 O(N2) 时间级别。

  复制的次数大致等于比较的次数,但是一次复制与一次交换的时间耗时不同,所以相对于随机数据,插入排序比冒泡快一倍,比选择排序略快。

这里需要注意的是,如果要进行逆序排列,那么每次比较和移动都会进行,这时候并不会比冒泡排序快。



原文地址:https://www.cnblogs.com/neowu/p/10743419.html

时间: 2024-10-18 05:15:37

冒泡排序、选择排序、直接插入排序的相关文章

排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序

算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,本文介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. //冒泡排序(排序10000个随机整数,用时约145ms) func bubbleSort(nums []int) { for i

常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)

这篇博客主要实现一些常见的排序算法.例如: //冒泡排序 //选择排序 //简单插入排序 //折半插入排序 //希尔排序 //归并排序 //双向的快速排序 //单向的快速排序 //堆排序 对于各个算法的实现原理,这里不再多说了,代码中注释较多,结合注释应该都能理解算法的原理,读者也可自己google一下.另外,注释中有很多点,比如边界条件.应用场景等已经用 * 标记,* 越多,越应该多注意. 下面是实现: //冒泡排序 void BubbleSort(int *arr, int n) { if(

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

选择排序、插入排序、冒泡排序python实现

选择排序的时间复杂度为O(n^2),是不稳定的排序 冒泡排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),平均情况下为O(n^2),是稳定的排序 插入排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),,平均情况下为O(n^2),是稳定的排序 1.选择排序 def selection(lista): leng=len(lista); for i in range(0,leng): index=i; min=lista[i]; for j in range(i,leng)

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后

js 排序 冒泡排序,选择排序,插入排序

冒泡排序: 对数组的中的数据,依次比较相邻两数的大小. 如果前面的数据大于后面的数据,就交换这两个数. 时间复杂度O(n^2) 1 function bubble(array){ 2 var temp; 3 for(var i=0; i<arr.length; i++){ 4 for(var j=0; j<arr.length; j++){ 5 if(arr[j]>arr[j+1]){ 6 temp = arr[j+1]; 7 arr[j+1] =arr[j]; 8 arr[j]=tem

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

各种常见的排序 要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度! #include <iostream> using namespace std; // 冒泡 void BubbleSort(int data[], int length) { if(data == NULL || length <= 0)

冒泡排序,选择排序,插入排序

从今天开始希望自己的博客可以持续的更新起来,由于本人能力有限,所以有些内容可能会有疏漏或者不全面,希望大家可以指出来,让我们一起学习,一起进步. 今天的内容是最简单的三个排序算法,冒泡排序,选择排序,插入排序,它们的时间复杂度都是O(N^2). 冒泡排序:首先第一个数与第二个数比较,如果前面的大于后面的就交换两个数,然后第二个与第三个比较,直到比较到最后,此时最后一个数为数组最大值,然后循环次步骤,第二次比较到倒数第二位,这样经过两次循环最后两位就排好了,经过N次循环,数组就拍好了 选择排序:从