首页 > 编程语言 > 详细

排序算法【整理】

时间:2020-02-25 13:11:34      阅读:57      评论:0      收藏:0      [点我收藏+]

一、分类

技术分享图片

二、时间复杂度

技术分享图片

 

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机

三、算法介绍及java实现(升序)

注意:通过举例子考虑边界

1、选择排序

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

选择排序是不稳定的排序方法,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了。

    public void xuanze(int[] nums){
        for(int i =0;i<nums.length-1;i++){ //最后一位默认有序
            int min = i;
            for(int j=i;j<nums.length;j++){
              if(nums[min]>nums[j])
                min=j;
            }
            int temp = nums[min];//交换排序
            nums[min] =nums[i];
            nums[i]=temp;
        }
    }

 

2、冒泡排序

每次比较相邻的元素,交换数组,大的值在前面。   时间复杂度由于交换操作多比选择排序高。

稳定。

    public void maopao(int[] nums){
        for(int i =0;i<nums.length;i++){
            for(int j = 0;i<nums.length-i-1;i--){
                if(nums[j]>nums[j+1]){
                    int temp = nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1] = temp;
                }}}
    }

 

3、插入排序

插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,算法适用于少量数据的排序,时间复杂度O(n^2)。

稳定

public void charu(int[] nums){
        for(int i =1;i<nums.length;i++){
        //找到在已排序中的位置
        int pos=0;
        while(nums[pos]<nums[i]){
            pos++;
        }
        int temp = nums[i];
        for(int j= i;j>pos;j--){
            nums[j]=nums[j-1];
        }
        nums[pos] =temp;
        }}

 

4、希尔排序

 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序

gap为增量,每次缩小二分之一的gap,在内部使用插入排序。不稳定。

public void xier(int[] nums){
        int gap = nums.length;
        while(gap>0){
        gap/=2;
        for(int i =0;i<gap;i++){
            for(int j =i+gap;j<nums.length;j+=gap){//插入排序
                int temp = nums[j];            
                int k = j - gap;            
                while (k >= 0 && nums[k] > temp) {                
                    nums[k + gap] = nums[k];                
                    k -= gap;            
                }            
                nums[k + gap] = temp;  
            }
        }
        if(gap==1)
        break;
        } }

 

5、归并排序

 

6、堆排序

 

7、快速排序

 

 

 

 

 

------------恢复内容结束------------

排序算法【整理】

原文:https://www.cnblogs.com/huchengxi/p/12360783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!