zoukankan      html  css  js  c++  java
  • 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);
               }
                 }
          }
          
    }   
  • 相关阅读:
    linux crontab 常用时间设置
    远程连接 mysql 数据库连接不上的解决方案
    Caffe搭建:Ubuntu14.04 + CUDA7.0 + opencv3.0 + Matlab2014A
    Ubuntu中sublime和Foxit Reader不能使用中文输入法解决方案
    python学习:python的星号(*)和双星号(**)用法
    Latex使用:在latex中添加算法模块
    Torch,Tensorflow使用: Ubuntu14.04(x64)+ CUDA8.0 安装 Torch和Tensorflow
    Caffe使用: Ubuntu 14.04(x64) 从cuda 7.0 升级到 cuda8.0
    Git使用:Linux(Ubuntu 14.04 x64)下安装Git并配置连接GitHub
    Git使用:安装,使用及常用命令整理
  • 原文地址:https://www.cnblogs.com/ytuan996/p/10579006.html
Copyright © 2011-2022 走看看