【数据结构与算法】O(n2) 排序总结

249 阅读1分钟

以由小到大排序为例。介绍三种时间复杂度为O(n2)O\left( n^2 \right) 的方法。

参考博文 blog.csdn.net/meibenxiang…

排序时间复杂度.png

1.冒泡排序

1.比较相邻元素。 第一个比第二个大,则交换。从开始第一对到结尾的最后一对。最后是排序区的最大值。

2.针对所有的元素重复以上的步骤,除了排序区的值。

持续对越来越少的元素重复上面的步骤,直到所有数进入排序区。

//升序
public static int[] bubbleSort(int[] array){
    if(array.length == 0 || array.length == 1) return array;
    for(int i = array.length - 1; i >= 0; i--){
        for(int j = 0; j < array.length - 1; j++){
            if(array[j] > array[j + 1]){
                int tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
            }
        }
    }
    return array;
}

贴一个写得很详细的博客 www.cnblogs.com/bigdata-sto…

2.选择排序

1.在未排序序列中找到最小元素,放到排序序列的首位

2.在未排序元素中继续寻找最小元素,放到已排序序列的末尾。

未排序的首元素作基准,遍历剩余元素,找最小。如果在剩余元素中找到最小,则交换。

重复第二步,直到所有元素均排序完毕。

public static int[] selectionSort(int[] array){
    if(array.length == 0 || array.length == 1) return array;

    for(int i = 0; i < array.length; i++){
        int minIndex = i;
        for(int j = i; j < array.length; j++){
            minIndex = array[j] < array[minIndex] ? j: minIndex;
        }
        if(minIndex != i){
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
    }
    return array;
}

3.插入排序

1.从第一个元素开始,该元素可以认为已经被排序;

2.取出下一个元素,在左排序区中从后向前扫描;

3.如果左排序区的元素大于新元素,新元素移到下一位置,直到找到已排序的元素小于或者等于新元素的位置;

4.将新元素插入到该位置,重复直到所有元素均排序完毕。

public static int[] insertionSort(int[] array){
    if(array.length == 0 || array.length == 1) return array;

    for(int i = 1;  i < array.length; i++){
        for(int j = i - 1; j >= 0; j--){
            if(array[j] > array[j + 1]){
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
    return array;
}