首页 > 其他分享 >排序复杂度

排序复杂度

时间:2023-04-15 11:01:18浏览次数:40  
标签:arr int 复杂度 low 数组 排序

  • 常见的排序算法中,效率高到低的排名如下:

    1. 快速排序(Quick Sort):时间复杂度平均情况下为 O(nlogn),是最快的排序算法之一。
    2. 归并排序(Merge Sort):时间复杂度稳定为 O(nlogn),但需要消耗额外的内存空间。
    3. 堆排序(Heap Sort):时间复杂度为 O(nlogn),实现简单,不需要额外的内存空间。
    4. 希尔排序(Shell Sort):时间复杂度为 O(n^(1.3-2)),是插入排序的改进版。
    5. 插入排序(Insertion Sort):时间复杂度最好情况下为 O(n),最坏情况下为 O(n^2)。
    6. 冒泡排序(Bubble Sort):时间复杂度最好情况下为 O(n),最坏情况下为 O(n^2)。

    需要注意的是,以上排序算法的时间复杂度都是在理论情况下得出的,实际运行效率还受到多种因素的影响,例如数据规模、数据分布等。此外,在实际应用中,还需要综合考虑排序算法的空间复杂度、稳定性、适用性等因素,选择最合适的排序算法。

  • 下面是一个基于 Java 实现的快速排序算法,以及打印每一轮排序后的数组内容:
    
    ```java
    public class QuickSort {
        public static void main(String[] args) {
            int[] arr = { 3, 1, 7, 5, 2, 4, 6 };
            int n = arr.length;
    
            quicksort(arr, 0, n - 1);
        }
    
        public static void quicksort(int[] arr, int low, int high) {
            if (low < high) {
                int pivot = partition(arr, low, high);
                System.out.print("第 " + (pivot + 1) + " 轮排序后的数组:");
                printArr(arr);
    
                quicksort(arr, low, pivot - 1);
                quicksort(arr, pivot + 1, high);
            }
        }
    
        public static int partition(int[] arr, int low, int high) {
            int pivot = arr[low];
            int i = low + 1;
            int j = high;
    
            while (i <= j) {
                while (i <= j && arr[i] <= pivot) {
                    i++;
                }
                while (i <= j && arr[j] > pivot) {
                    j--;
                }
    
                if (i < j) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
    
            int temp = arr[low];
            arr[low] = arr[j];
            arr[j] = temp;
    
            return j;
        }
    
        public static void printArr(int[] arr) {
            for (int k = 0; k < arr.length; k++) {
                System.out.print(arr[k] + " ");
            }
            System.out.println();
        }
    }
    ```
    
    在上面的代码中,定义了一个数组 `arr` 并初始化了其值。然后通过调用 `quicksort` 函数进行排序。`quicksort` 函数是递归实现的快速排序算法,接收数组、起始位置和结束位置三个参数,当起始位置小于结束位置时进行排序。
    
    在 `quicksort` 函数中,首先通过调用 `partition` 函数将数组分为左右两个部分,并返回分界点的位置,然后分别对左右两个部分进行递归排序。在每次递归调用结束后,会打印当前轮数以及排序后的数组内容。
    
    `partition` 函数实现了快速排序中的分区操作,选择第一个元素作为枢轴(pivot),比枢轴小的元素放在左边,比枢轴大的元素放在右边。最后将枢轴放在分界点上。在函数内部也会打印当前轮数以及排序后的数组内容。
    
    最后,在程序中定义了一个 `printArr` 函数,用于输出当前数组的内容。这样就能够清晰地查看每一轮排序后的结果。
    
    需要注意的是,在实际使用时,可以将快速排序封装成一个函数,然后在函数中打印每一轮排序后的结果,这样能够使代码更加清晰、易于维护。

     

  • 下面是一个基于 Java 实现的冒泡排序,以及打印每一轮排序后的数组内容:
    
    ```java
    public class BubbleSort {
        public static void main(String[] args) {
            int[] arr = { 3, 1, 7, 5, 2, 4, 6 };
            int n = arr.length;
    
            // 冒泡排序
            for (int i = 0; i < n - 1; i++) {
                boolean swapped = false;
                for (int j = 0; j < n - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                        swapped = true;
                    }
                }
                System.out.print("第 " + (i + 1) + " 轮排序后的数组:");
                for (int k = 0; k < n; k++) {
                    System.out.print(arr[k] + " ");
                }
                System.out.println();
                if (!swapped) {
                    break;
                }
            }
        }
    }
    ```
    
    在上面的代码中,定义了一个数组 `arr` 并初始化了其值。然后使用两层循环实现冒泡排序,外层循环控制排序轮数,内层循环执行每一轮的比较交换操作。
    
    在内层循环中,通过判断相邻两个元素的大小,如果前者大于后者,则交换两个元素的值。同时,记录是否发生了交换的标志 `swapped`,如果没有发生交换说明数组已经有序,直接退出循环。
    
    在每一轮排序结束后,使用一个循环输出当前数组的内容,以及当前轮数。这样就能够清晰地查看每一轮排序后的结果。
    
    需要注意的是,在实际使用时,可以将冒泡排序封装成一个函数,然后在函数中打印每一轮排序后的结果,这样能够使代码更加清晰、易于维护。

     

标签:arr,int,复杂度,low,数组,排序
From: https://www.cnblogs.com/springcloud/p/17320691.html

相关文章

  • leetcode:排序数组
    题目描述给你一个整数数组 nums,请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]题目地址:912.排序数组解题思路 这道题目直接告诉你了要排序,关键是选中什么样的排序算法?题目的限制条件是有两个,第......
  • redis里使用lua脚本对hash里的数据进行排序
    注意:本脚本只适用于数据量较少的集合进行排序,数据量太大会严重影响redis的性能。localt=redis.call('hgetall',KEYS[1]);localarr={};fori,vinpairs(t)doifi%2==0thenlocalj=cjson.decode(v)ifj.language==ARGV[1]thenj.lan......
  • 排序算法-选择排序
    排序算法-选择排序1.简单选择排序SelectSort1.1SelectSort介绍简单选择排序(selectSort)的基本思想是:每一轮排序都从待排序的序列(无序区)中选取一个最小值,并将其与无序区的第一个元素进行交换,此时有序区长度+1,无序区长度-1。重复上述过程直至整个序列完成排序。1.2图......
  • 冒泡排序和选择排序
    冒泡排序:对N个整数(数据由键盘输入)进行升序排列。解题思路:输入N个整数利用数组储存,利用for循环判断前后两数的大小,前面的数大于后面的数则交换位置,经过一次循环后最大的数就会到最后一位,下次循环只需进行除去最后一个数的其他数判断交换位置即可。利用循环嵌套即可实现冒泡排序。......
  • 17.6归并排序原理及实战
    #include<stdio.h>#include<stdlib.h>#defineN7typedefintElemType;voidMerge(ElemTypeA[],intlow,intmid,inthigh){staticElemTypeB[N];//加static的目的是无论函数执行多少次,都只有一个B[N]inti,j,k;for(i=low;i<=high;i++){......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描......
  • 17.5堆排序实战
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<string>typedefintElemType;typedefstruct{ElemType*elem;//存储元素的起始地址intTableLen;//元素个数}SSTable;voidST_Init(SSTable&ST,intlen){S......
  • 数组元素排序(一)
    算法概述定义      排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为{K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。      通常来说,排序的目的是快速查找......
  • 【DS】算法的时间复杂度与空间复杂度
    文章目录算法的时间复杂度与空间复杂度1.算法效率2.时间复杂度2.1时间复杂度的概念2.2大O渐进表示法2.3常见时间复杂度计算实例实例1——实例2——实例3——实例4——时间复杂度是做悲观预期实例5——冒泡排序·思想计算实例6——二分查找·思想计算实例7、8-——递......
  • 17.3选择排序原理及实战
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<string>typedefintElemType;typedefstruct{ElemType*elem;//存储元素的起始地址intTableLen;//元素个数}SSTable;voidST_Init(SSTable&ST,intlen){S......