zoukankan      html  css  js  c++  java
  • 排序基础之插入排序、冒泡排序、选择排序详解与Java代码实现

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594533.html 

    一:插入排序==逐个往前相邻数比较交换,小的在前

          第一轮:A[1]与A[0]比较,小的在前面;

          第二轮:A[2]~A[0]相邻数比较,小的交换到前面,直到合适位置;

          ...

          第n-1轮:A[n-1]往前比较,小则交换到前面,继续比较交换直到合适位置。

          复杂度计算:T=1+2+...(n-1)=(n-1)(n-2)/2=O(n^2)

    public int[] insertionSort(int[] A, int n) {
            for(int i=0;i<n-1;++i){//i标记有序序列最后位置
                for(int j=i+1;j>0;--j){//j为待插入元素
                    if(A[j]<A[j-1]){//从j开始不断与自己的前面元素比较交换
                        int temp;
                        temp=A[j-1];
                        A[j-1]=A[j];
                        A[j]=temp;
                    }
                }
            }
            return A;
        }

     

    二:冒泡排序==相邻数比较交换,大者放在后面,每一次把当前轮最大者交换到末尾

          排序开始:从0到n-1,进行相邻数比较交换操作,大者放在后面

          第二轮:从0到n-1,进行相邻数比较交换操作,大者放在后面

          ......

          第n-1轮:比较a[0]和a[1],大者放后面。此时整个数组有序。

          复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)

    public class BubbleSort {
        public int[] bubbleSort(int[] A, int n) {
    
            while(n>=1){//n控制当前是第几轮
                for(int i=0;i<n-1;++i){//i负责当前轮的比较交换。注意这里是<n-1。而不是<=n-1。因为下面是i与i+1比较,如果遍历到n-1的话i+1就越界了
                    if(A[i]>A[i+1]){//比较,交换,让相邻两者大的在后面
                        int temp;
                        temp=A[i];
                        A[i]=A[i+1];
                        A[i+1]=temp;
                    }
                }
                --n;//当前轮结束,缩小范围
            }
            return A;
        }
    }

    三:选择排序==每次选择待排序列最小者交换到待排序列的最前方

         排序开始:从0到n-1遍历,选出最小者,交换到0位置;

         第二轮:从1到n-1遍历,选择出最小者,交换到1位置;

         ...

         第n-1轮:从n-2到n-1之间,选择最小者,放到n-2处。此时,0~n-1有序。

         复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)

    public int[] selectionSort(int[] A, int n) {
    
            for(int i=0;i<=n-1;++i){//当前轮待排序的开始位置
                int min=i;//记录待排序列最小值下标
                for(int j=i;j<=n-1;++j){
                    if(A[min]>A[j]){
                        min=j;//选择最小值下标
                    }
                }
                if(min!=i){//如果待排序列开头不是最小值,则交换
                    int temp;
                    temp=A[i];
                    A[i]=A[min];
                    A[min]=temp;
                }
            }
            return A;
        }

    总结:三个O(n^2)的排序算法,插入、冒泡都是相邻元素比较交换达到合适位置的,选择则每次选出最小者交换到开头

  • 相关阅读:
    Alpha冲刺
    Alpha冲刺
    Alpha冲刺
    Alpha冲刺
    抽奖系统(记一次未完成的教训)
    Alpha冲刺
    Alpha冲刺
    Alpha冲刺 (2/10)
    Alpha 冲刺 (1/10)
    软工 团队第三次作业
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6594533.html
Copyright © 2011-2022 走看看