当前位置: 首页 > 科技观察

更详细的排序算法总结_0

时间:2023-03-22 01:47:34 科技观察

排序算法平均时间复杂度冒泡排序O(n2)选择排序O(n2)插入排序O(n2)希尔排序O(n1.5)快速排序O(N*logN)归并排序O(N*logN)堆排序O(N*logN)基数排序O(d(n+r))1.冒泡排序(BubbleSort)基本思想:比较两个数的大小,较大的数下沉,较小的数上升。过程:比较两个相邻的数据,如果第二个数小,交换位置。从后往前两个两个比较,直到比较前两个数据。最后将最小数交换到起始位置,这样第一个最小数的位置就排好了。继续重复上述过程,将2.3...n-1个最小的数依次排列。冒泡排序平均时间复杂度:O(n2)Java代码实现:publicstaticvoidBubbleSort(int[]arr){inttemp;//临时变量for(inti=0;ii;j--){if(arr[j]i;j--){if(arr[j]0;j--){if(数组[j]<数组[j-1]){temp=数组[j-1];数组[j-1]=数组[j];array[j]=temp;}else{//不需要交换break;}}}}4.Shell排序(ShellSort)前言:数据序列1:13-17-20-42-28使用插入排序,13-17-20-28-42。掉期数:1;数据序列2:13-17-20-42-14使用插入排序,13-14-17-20-42。掉期数:3;如果数据序列基本有序,使用插入排序效率会更高。基本思想:在一组待排序的数中,按照一定的增量将其分成若干个子序列,分别对子序列进行插入排序。然后逐渐减小增量,重复上述过程。直到增量为1,此时数据序列基本有序,最后进行插入排序。过程:Shell排序平均时间复杂度:java代码实现:publicstaticvoidshell_sort(intarray[],intlenth){inttemp=0;intincre=lenth;while(true){incre=incre/2;for(intk=0;kk;j-=incre){if(array[j]=r)return;inti=l;intj=r;intkey=a[l];//选择***数作为keywhile(i=key)//找到第一个值j--;if(i=0;i--){MinHeapFixdown(a,i,n);}}//从节点i开始调整,n为节点总数,计算节点i从0到2*i+1、2*i+2的子节点publicstaticvoidMinHeapFixdown(inta[],inti,intn){intj=2*i+1;//子节点inttemp=0;while(j0;i--){temp=a[0];a[0]=a[i];a[i]=temp;MinHeapFixdown(a,0,i);}}8.基数排序(RadixSort)BinSort基本思想:TheideaBinSort的实现很简单,首先创建一个数组A[MaxValue];然后把每个数字放到对应的位置(比如17放在下标17的数组位置);***遍历数组,就是排序后的结果。图解:BinSort问题:当序列中有很大的值时,BinSort的排序方式浪费了大量的空间开销。RadixSort的基本思想:基数排序是在BinSort的基础上,通过基数限制来减少空间开销。流程:流程1流程2(1)首先确定基数为10,数组长度为10,每个数字34都会在这10个数字中找到自己的位置。(2)不同于BinSort直接将数字34放在数组下标34处,基数排序将34分为3和4,第一轮排序将数字34放在数组下标4处最后一位。第二轮排序按照倒数第二位放在数组下标3处,即可遍历数组。Java代码实现:publicstaticvoidRadixSort(intA[],inttemp[],intn,intk,intr,intcnt[]){//A:原始数组//temp:临时数组//n:序列中数字的个数//k:***digits2//r:base10//cnt:存储bin[i]的个数for(inti=0,rtok=1;i=0;j--){//重点理解cnt[(A[j]/rtok)%r]--;temp[cnt[(A[j]/rtok)%r]]=A[j];}for(intj=0;j