三种时间复杂度为O(n^2)的排序算法

1.冒泡排序

基本思想:依次比较相邻元素,若前面的大于后面的就交换元素,在一次迭代中将最大的元素“沉降”到最后的位置,经过n-1次迭代即可完成排序目的。

    public static void bubbleSort(int[] data) {
        for(int i=0;i<data.length-1;i++) {
            boolean Bfinished=true;//排序完成标志位
            for(int j=0;j<data.length-1-i;j++) {
                if(data[j]>data[j+1]) {
                    change(data,j,j+1);
                    Bfinished=false;
                }
            }
            if(Bfinished) {
                break;
            }
        }
    }

上述代码是优化后的冒泡排序,我们知道在一次迭代中,若一次交换都没发生,就可以证明排序已经完成,不需要再进行后面的迭代了。

2.选择排序

基本思想:将序列划分为有序部分和无序部分(有序部分在前),有序部分初始长度=0.依次从无序部分找到最小值放到有序部分的最后一位,有序部分长度++,无序部分长度--。最终使得有序部分长度=n,无序长度=0。

    public static void selectSort(int[] data) {
        for(int i=0;i<data.length;i++) {
            int indexofMin=i;
            for(int j=i+1;j<data.length;j++) {
                if(data[j]<data[indexofMin]) {
                    indexofMin=j;
                }
            }
            change(data,i,indexofMin);
        }
    }

3.插入排序

基本思想:与选择排序相类似,将序列也分为有序部分+无序部分。与选择排序不同的是insertsort()是从无序部分依次取出插入到有序部分。

    public static void insertSort(int[] data) {
        for(int i=1;i<data.length;i++) {//第i轮,表示把data【i】插入到前i-1的有序序列中
            int j=0;
            int temp=data[i];
            for(j=i;j>0&&data[j-1]>temp;j--) {
                //依次遍历i之前的元素,若之前的元素大于该元素,就把该元素往后移一位
                data[j]=data[j-1];
            }
            data[j]=temp;
        }
    }
发布了38 篇原创文章 · 获赞 4 · 访问量 2161

猜你喜欢

转载自blog.csdn.net/gw_9527/article/details/98754054
今日推荐