O(n^2) 级别的排序算法

o(n^2) 的排序算法。性能那么差,为什么还要学习?

   首先,它是基础,千里之行,始于足下。它编码简单,容易实现,是一些简单情景的首选,它能给我们的问题一个暴力的解法,这样的解法也许不是最优的,但是它能给我们想出其他的优化算法一些启发,思路。

 

一、选择排序

选择排序是在给定的数据集合中,找出最小的值放在前面,依次类推,直到所有的元素都排序完成。

代码实现:

 1     public static void selectionSorted(int arr[]
 2 
 3         int n = arr.length;
 4         for (int i = 0; i < n; i++) {
 5             // 在[i...n] 闭区间中寻找最小值
 6             int minIndex = i;
 7             for (int j = i + 1; j < n; j++) {
 8                 if (arr[j] < arr[i]) {
 9                     minIndex = j;
10                 }
11                 SortedHandler.swap(arr, minIndex, i);
12             }
13         }
14     }

 二、插入排序

基本操作的插入排序 (其实这样性能是低于选择排序的)

    public static void insertSorted(int[] arr) {

        int n = arr.length;
        // 从数组的第二个元素开始循环数组
        for (int i = 1; i < n; i++) {
            // 将第 i 个元素插入到 [0...j-1] 闭区间中的合适位置,
            // 这里的 j 不用等于 0 ,说明j的最后一个比较的元素是 该数组的 下标为0 的元素
            for (int j = i; j > 0; j--) {
                if (arr[j] < arr[j - 1])
                    SortedHandler.swap(arr, j, j - 1);
                else
                    break;
            }

            // 第二层循环的第二种写法,
            // 如果 arr[j] < arr[j-1] 的话,退出本次的内层循环,
            // 从这里也可以看出插入排序的性能其实是由于选择排序的,尽管它们的时间复杂度都是 O(n)
//            for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
//                SortedHandler.swap(arr, j, j - 1);
//            }
        }
    }

 改进版本的插入排序(性能高于选择排序)

对于近乎有序的数组,它的表现可能更高于O(logn)级别的算法。

    public static void insertSorted(int[] arr) {

        int n = arr.length;
        for (int i = 1; i < n; i++) {
            int tmp = arr[i];
            int j;         // tmp元素应该存放的位置
            for (j = i; j > 0 && arr[j - 1] > tmp; j--) {
                arr[j] = arr[j - 1];
            }
            arr[j] = tmp;

        }
    }

 三、 冒泡排序

public void bubbleSorted (int arr [] ) {
        
      int n = arr.length;
      for ( int i =0; i < n -1; i++ ) {
            for ( int j =0; j < n -1 -i; j++) {
                  if ( arr[ j ] > arr[ j+1 ]){
            SortedHandler.swap(arr, j, j + 1);
           }
             }
      }
      
}   

 

posted @ 2019-03-22 16:18  嘿!小伙不错  阅读(471)  评论(0编辑  收藏  举报