zoukankan      html  css  js  c++  java
  • 经常用的排序算法

    本博客是整理的百度百科方面的内容综合。

    在每一种方法的介绍顶部,都有百度百科的直接链接(关于本方法的介绍,百度百科真的爱了,特别的全)

    1.插入排序

      1.直接插入排序

      2.折半插入排序

    插入排序是一种简单直观且稳定的排序算法。将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的序列。
    (时间复杂度是O(n^2))

    算法稳定性:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有一个元素,就是第一个元素。比较是从有序序列的末尾开始的,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。想等元素的前后序列没有改变,从原无需序列出去的顺序就是排好后的顺序,所以插入排序是稳定的。

    2.希尔排序

    希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

    时间复杂度分析:

    希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。

    稳定性分析:

    不稳定

    3.冒泡算法

    冒泡排序就是把小的元素往前调,把大的元素往后调

    (排序算法最好的时间复杂度是O(n)最坏的时间复杂度是,平均时间复杂度是

    算法稳定性:冒泡排序就是把小的元素往前调,把大的元素往后调。比较的是相邻的两个元素比较,交换也是发生在两个元素之间。所以如果相邻的两个元素是相等的,是不会发生交换的。所以冒泡排序是一种稳定排序算法。

    4.选择排序

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

    时间复杂度:

    选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。

    稳定性:不稳定

    5.堆排序

      推荐一个方法:这个方法的博客地址

      1)建立堆

      2)得到堆顶元素为最大元素

      3)去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。

      4)堆顶元素为最大元素。

      5)重复步骤3,直到堆变空

    时间复杂度:

    堆排序的时间复杂度是nlogn级别。

    稳定性:不稳定

     6.快速排序

     快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然 后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    时间复杂度和堆排序一样nlogn级别。

    稳定性不稳定

    各个排序算法的代码编写

    1.插入排序(java代码编写)

    /**
    *插入排序
    *@paramarr
    *@return
    */
    private static int[] insertSort(int[]arr){
    if(arr == null || arr.length < 2){
        return arr;
    }
    for(inti=1;i<arr.length;i++){
    for(intj=i;j>0;j--){
    if(arr[j]<arr[j-1]){
    //TODO:
    int temp=arr[j];
    arr[j]=arr[j-1];
    arr[j-1]=temp;
    //
    }else{
    //接下来是无用功
    break;
    }
    }
    }
    return arr;
    }
    2.希尔排序代码(java编写)
    public static void main(String [] args)
    {
        int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1};
            System.out.println("排序之前:");
            for(int i=0;i<a.length;i++)
            {
                System.out.print(a[i]+" ");
            }
            //希尔排序
            int d=a.length;
                while(true)
                {
                    d=d/2;
                    for(int x=0;x<d;x++)
                    {
                        for(int i=x+d;i<a.length;i=i+d)
                        {
                            int temp=a[i];
                            int j;
                            for(j=i-d;j>=0&&a[j]>temp;j=j-d)
                            {
                                a[j+d]=a[j];
                            }
                            a[j+d]=temp;
                        }
                    }
                    if(d==1)
                    {
                        break;
                    }
                }
                System.out.println();
                System.out.println("排序之后:");
                    for(int i=0;i<a.length;i++)
                    {
                        System.out.print(a[i]+" ");
                    }
        }

    3.冒泡算法(java代码编写)

    public static void bubbleSort(int []arr) { 

     for(int i =1;i<arr.length;i++) { 
      for(int j=0;j<arr.length-i;j++) {
        if(arr[j]>arr[j+1]) {
        int temp = arr[j];
        arr[j]=arr[j+1]     
        arr[j+1]=temp;
                       }
              }    
         }
    }
    4.选择排序:(java代码编写)
    public static void selectionSort(int[] arr){
            
           for (int i = 0; i < arr.length - 1; i++) {    
                int  min = i;
                for (int j = i + 1; j < arr.length; j++) {
                      if (arr[min] > arr[j]) {
                           min = j;
                      }
                }
                if (min != i) {
                   int tmp = arr[min];
                   arr[min] = arr[i];
                   arr[i] = tmp;
                }             
          }
     
    }
     
     
  • 相关阅读:
    java实现亲密数
    java实现亲密数
    java实现亲密数
    java实现亲密数
    java实现坐标
    java实现坐标
    java实现坐标
    java实现坐标
    java实现坐标
    spring中注解注入 context:component-scan 的使用说明
  • 原文地址:https://www.cnblogs.com/littleswan/p/11377188.html
Copyright © 2011-2022 走看看