经常用的排序算法

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

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

 

 

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;
             }             
       }
 
}
 
 

转载于:https://www.cnblogs.com/littleswan/p/11377188.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值