zoukankan      html  css  js  c++  java
  • 排序算法一冒泡排序

    原理
      比较两个相邻的元素,将值大的元素交换至右端。

      这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。

    算法分析

                  冒泡排序算法的性能

    排序类别

    排序方法

    时间复杂度

    空间复杂度

    稳定性

    复杂性

    平均情况

    最坏情况

    最好情况

    交换排序

    冒泡排序

    O(N2)

    O(N2)

    O(N)

    O(1)

    稳定

    简单

    时间复杂度

       1.如果我们的数据正序,只需要走一趟即可完成排序。
         所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;
         所以,冒泡排序最好的时间复杂度为-----O(n)。
       2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。
         每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。
         在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为-----O(n2) 。
      综上所述:冒泡排序总的平均时间复杂度为-----O(n2) 。

    算法稳定性

    冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

       所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

     1 public class BubbleSort {
     2     public void sort(){ 
    4
    int[] arr = {12,123,3,1,0,6,4,6};
    8
    //优化代码,如果未交换则代表有序 9 boolean isChange= false; 10 11 if(arr==null || arr.length<2){ 12 return ; 13 } 14 for(int i =0;i<arr.length-1;i++){ 15 isChange=false; 16 for(int j=0;j<arr.length-1-i;j++){ 17 if(arr[j]>arr[j+1]){ 18 swap(arr,j,j+1); 19 isChange=true; 20 } 21 } 22 if(!isChange){ 23 break; 24 } 25 } 32 } 33 34 private void swap(int[] arr,int i, int j) { 35 arr[i]=arr[i] ^ arr[j]; 36 arr[j]=arr[i] ^ arr[j]; 37 arr[i]=arr[i] ^ arr[j]; 38 39 } 40 }
  • 相关阅读:
    LeetCode刷题7——数字的补数
    Leetcode刷题6—不同路径
    Leetcode刷题5—最大子序和
    LeetCode刷题4——子集
    LeetCode刷题3——位1的个数
    LeetCode刷题2——颠倒二进制位
    小鸡啄米问题求解
    weavenet
    为系统守护进程预留计算资源
    PolicyRouting (ip rule)
  • 原文地址:https://www.cnblogs.com/loveer/p/11264968.html
Copyright © 2011-2022 走看看