首页 > 代码库 > O(n^2)类型的几种排序算法

O(n^2)类型的几种排序算法

一、冒泡排序

1.原理

(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个;

(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数;

(3)针对所有的元素重复以上的步骤,除了最后一个;

(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2.一个直接但是低效的实现

public void sort(int[] array) {
  //外层循环从第0个元素遍历到倒数第二个元素,主要是用来控制内层循环的次数
  //因为外层循环每跑一次,最大的数就会到最后面
    for (int i = 0; i < array.length - 1; i++) {
    //内层循环,遍历数组的每一个数(每一趟遍历的数量都在减小,因为最后面的是不需要比较的)
    //如果前面的比后面的大,就交换这俩个数
        for (int j = 0; j < array.length - i - 1; j++) {
            if (array[j] > array[j+1]) {
                int temp = array[j+1];
                array[j+1] = array[j];
                array[j] =temp;
            }
        }
    }
}

 

3.优化版本(优化的地方是,如果遍历了一次,发现没有任何交换,那么说明已经排好序了,后面就可以不用排了)

public void sort(int[] array) {
    boolean swaped;
    int n = array.length;
    do {
        swaped = false;
        for (int i = 1; i < n; i++) {
            if (array[i - 1] > array[i]) {
               //如果这趟有两个元素换过位置,那么是否排过序设置成true
               //一旦有某一趟没有任何两个元素换过位置,说明已经排好了,整个排序过程可以停止了
                int temp = array[i - 1];
                array[i - 1] = array[i];
                array[i] = temp;
                swaped = true;
            }
        }
        n--;
    } while (swaped);
}

 

 

 

 

二、选择排序

三、插入排序

四、希尔排序

 

O(n^2)类型的几种排序算法