排序算法及优化

本文详细介绍了冒泡排序、插入排序及其优化、希尔排序、选择排序、快速排序及其优化、堆排序、归并排序及其非递归实现,以及其他几种特殊排序算法如计数排序、基数排序和桶排序。此外,还探讨了如何处理海量数据排序问题。
摘要由CSDN通过智能技术生成


前言

内排序 :将数据存储在内存上,在内存上进行的排序
外排序:将数据存储在外存上(例如磁盘,硬盘)排序的
七种排序是基于比较的排序,另外还有三种基于非比较的排序。

一、冒泡排序

1.冒泡排序是一种稳定的排序,思想就是遍历数组是将相邻的两个元素进行比较,值大的就往后面放,一趟冒泡排序的结果就是将数组中最大的值放到了最后面,之后遍历长度就能够减少。
2.时间复杂度是O(n^2),最好情况下数组有序时间复杂度为O(N),空间复杂度为O(1)。
3.优化就是插入一个变量查看看遍历一遍是否进行了交换,没有交换就说明已经有序了。

 public void bubbleSort(int []array){
   
        //冒泡排序就是每次排序的时候都将最大值挪到最后的位置
        for(int i=0;i<array.length;i++){
   
            boolean flg=true;
            for(int j=0;j<array.length-i-1;j++){
   
                if(array[j]>array[j+1]){
   
                    int temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                    flg=false;
                }
            }
              if(flg){
   
                  break;
            }
        }
    }

二、插入排序

1.插入排序就像玩扑克牌时一样,将手中的牌插入到合适的位置,排序时先认为第一个元素已经有序,之后遍历将其他元素放到合适的位置即可,
2.插入排序时间复杂度是O(N^2),时间复杂度为O(1)
代码实现就是先将代排序的拿出来,之后后面每个元素与其比较将它放到合适的位置,默认前1个元素有序

public static void insertSort(int []array){
   
        for(int i=1;i<array.length;i++){
   
            int temp=array[i];
            int j=i-1;
            for(;j>=0;j--){
   
                if(array[j]>temp){
   
                    array[j+1]=array[j];
                }else {
   
     //因为前面的元素都是有序的 如果该元素都大于i-1位置元素,那它的位置就是合适的位置,无需排序
                    break;
                }
            }
            array[j+1]=temp;
        }
    }

1.优化插入排序

针对插入排序的优化就是对待排序元素位置的查找,用二分查找快速找到插入位置,

	 public static void insertSort(int []array) {
   
        for (int i = 1; i < array.length; i++) {
   
            int temp = array[i];
            int left = 0;
            int right = i;
            while (left < right) {
   
                int mid = (left + right) >> 1;
                if (array[mid] < temp) {
   
                    left = mid + 1;
                } else {
   
                    right = mid;
                }
            }
    //前面的元素都是有序的,之后将待排序的元素和中间位置元素进行比较,快速找到代排序的位置
            for (int j = i; j > left; j--) {
   
                array[j] = array[j - 1];
            }
            array[left] = temp;
        }
    }

三、希尔排序

其实希尔排序就是对插入插入排序的优化,利用分组的思想
例如:你要将一万个无序数据进行排序,插入排序的时间复杂度就是 O(10000^2)
但是你进行分组,将一万个数据分成100组,在组内进行排序 O(100^2)*100组 是O(1000000)一百万比一亿小的多,这才是10000个数据的差值。
一般情况的时间复杂度是O(N^1.3~1.5)最坏情况是O(N ^2) 空间复杂度为O(1)
最主要的就是对增量的定义一般取质数 ,

public static void shellSort(int []array,int gap){
   
        for(int i=gap;i<array.length;i++){
   
            int temp=array[i];
            int j=i-gap;
            for(;j>=0;j-=gap){
   
                if(array[j]>temp){
   
                    array[j+gap
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值