排序算法总结

devtools/2024/9/24 22:54:21/

1.冒泡排序

冒泡排序是经典的入门算法,可以说每个人都会写它,但它也可以优化。在面试中让写冒泡排序,不要简单以为就是让你写两重循环,可能是在考察你对它的优化。
基础版本:

java"> public  void sort(int[] arr){int len = arr.length;for(int i=len-1;i>0;i--)for(int j=0;j<i;j++){if(arr[j]>arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}

我们最常用的这种写法的时间复杂度始终为O(n^2),但其实可以利用数组中元素已有的顺序来优化该代码。

优化一:当算法执行过程中数组已经是有序数组了,这是就没有必要继续执行完n-1趟外循环,可以直接结束了。具体实现我们可以通过一个标志,来记录当前一趟外循环,在遍历过程中是否发生交换,如果没有交换说明,数组已经是有序数组,可以跳出循环了。

java">public  void sort(int[] arr){int len = arr.length;boolean flag;for(int i=len-1;i>0;i--){flag = false;for(int j=0;j<i;j++){if(arr[j]>arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;flag = true;}}if(!flag) break;}

优化二:在某种情况下,如果进行了若干次排序后,后面的若干个数已经是有序的,那么下一趟排序只需要比较前面无序的那部分即可。所以我们可以设置一个标志位记录每一趟排序中最后一次值交换的位置,下一趟排序只需比较到此位置即可。

java">public static void sort(int[] arr){int len = arr.length;int i;int flag = len-1;while(flag>0){i = flag;for(int j=0;j<i;j++){if(arr[j]>arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;flag = j;}}}}

经过优化后,冒泡排序平均时间复杂度为O ( n ^ 2 ) ,最好情况下O(n),最坏情况下O( n^2),是稳定的算法>排序算法
空间复杂度为O(1)
2.快速排序
快排对于已经有序的数组或者所有数据都相等的数组排序的时间复杂度是O(n^2),这种情况可以有多种方式优化。这种情况有多种方法优化,比如,可以尝试把数据分成3组,即大于枢值为一组,等于枢值为一组,小于枢值为一组,其原因很好理解,这里就不赘述了。也可以评估数据的个数,对于较少的数据,完全不需要使用快速排序,可以直接使用选择排序或者希尔排序。也可以通过随机获取枢值来解决。
快排的平均时间复杂度是O(nlogn),除了快速排序,堆排序和归并排序的时间复杂度也是O(nlogn),为什么一般都说快速排序是最快的算法>排序算法呢?这是因为对于时间复杂度为O(nlogn)的算法,log的下标为常数c。快速排序之所以快,是因为它的常数c比较小,在具体应用中快排的表现也最好。

java">public void quickSort(int[] nums,int low,int high){if(low<high){int pivotpos = partition(nums,low,high);quickSort(nums,low,pivotpos-1);quickSort(nums,pivotpos+1,high);}}public int partition(int[] nums,int low,int high){int pivot = nums[low];while(low<high){while(low<high&&nums[high]>=pivot) high--;nums[low] = nums[high];while(low<high && nums[low]<=pivot) low++;nums[high] = nums[low];}nums[low] = pivot;return low;}

稳定性:快排算法是一种不稳定的算法>排序算法。比如在划分算法中,若右端有两个关键字相同,且均小于基准值的记录,则在交换到左端区间后,它们的相对位置会发生变化。
空间复杂度:最好情况O(log2n),最坏请开给你下O(n),平均情况下栈的深度为O(log2n)
时间复杂度:快速排序的运行时间与划分是否对称有关,最好是O(nlogn),平均也是O(nlogn),当数组基本有序后者基本逆序的情况下时间复杂度为O(n2);

为了解决在极端情况下时间复杂度为O(n2)的情况,可以在获取基准下标时使用随机数来获取,而不是默认区间的左侧下标。

java">public void randomizedQuickSort(int[] nums,int low,int high){if(low<high){int pivotpos = randomizedPartition(nums,low,high);randomizedQuickSort(nums,low,pivotpos-1);randomizedQuickSort(nums,pivotpos+1,high);}}public int randomizedPartition(int[] nums,int low,int high){int i = new Random().nextInt(high - low +1)+low; //nextInt(x)会生成0-x的整数,不包含xswap(nums,low,i);return partition(nums,low,high);}public int partition(int[] nums,int low,int high){int pivot = nums[low];while(low<high){while(low<high&&nums[high]>=pivot) high--;nums[low] = nums[high];while(low<high && nums[low]<=pivot) low++;nums[high] = nums[low];}nums[low] = pivot;return low;}public void swap(int[] nums,int i ,int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}

http://www.ppmy.cn/devtools/8694.html

相关文章

C#编程过程中List、array、ArrayList这三个推荐用那个

在 C# 编程中&#xff0c;选择使用 List、数组&#xff08;array&#xff09;、ArrayList 这三个集合类型取决于具体的需求和场景&#xff1a; List&#xff1a; List 是泛型集合&#xff0c;提供了类型安全性和性能优势&#xff0c;通常情况下是最佳选择。 当你需要在集合中…

详细说一下索引和性能优化

当我们谈到数据库性能优化时&#xff0c;索引是一个非常重要的篇章。数据库索引是一个数据结构&#xff0c;它可以帮助数据库系统更快地查找数据。 什么是索引&#xff1a; 数据库索引是一种特殊的数据结构&#xff0c;它可以提高数据库查询的速度。可以简单地将数据库索引理解…

使用 less

使用 less less-loader 对应版本 npm install less4.1.1 less-loader7.3.0 --save-dev node &#xff1a;16.4.0

第52篇:算法的硬件实现<三>

Q&#xff1a;本期我们介绍二进制搜索算法电路&#xff0c;用于查找某个数据在数组中的位置。 A&#xff1a;基本原理&#xff1a;从数组的中间元素开始&#xff0c;如果给定值和中间元素的关键字相等&#xff0c;则查找成功&#xff1b;如果给定值大于或者小于中间元素的关键…

文旅IP孵化打造抖音宣传推广运营策划方案

【干货资料持续更新&#xff0c;以防走丢】 文旅IP孵化打造抖音宣传推广运营策划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 文旅IP抖音运营方案 1. 项目背景与目标 - 背景&#xff1a…

【面试经典 150 | 数组】最后一个单词的长度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Mac中隐私安全性设置-打开任何来源

文章目录 **Mac中隐私安全性设置-打开任何来源**一、目的二、打开方式 Mac中隐私安全性设置-打开任何来源 一、目的 从外部下载的软件频繁打不开&#xff0c;需要从隐私安全性中重新选择一下&#xff1b;默认Mac隐藏了任何来源 二、打开方式 打开终端&#xff0c;输入一下命…

读取数据透视表多列形态数据作图

示例文件 import pandas as pd import numpy as np import datetime todaystr(datetime.date.today())filepath/Users/kangyongqing/Documents/kangyq/202404/NPS评分/ file105NPS信息匹配分析2024-04-22.xlsx#从第三行开始读取列名&#xff0c;第一列作为索引 df1pd.read_exc…