摘要:需要注意的是排升序要建大堆,排降序建小堆。應(yīng)用場(chǎng)景需要前個(gè)最大或最小元素時(shí),或者與其他排序一塊使用五冒泡排序排序思想大的元素向下沉,小的元素向上浮。
目錄
5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性
?6.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析
5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析
4.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性
?5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性
5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析
5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性
就是將待排序的數(shù)字插入到已經(jīng)排序好的指定位置即可,直到所有需要排序的數(shù)字都插入到序列即可,從而得到一個(gè)有序的序列。(相當(dāng)于我們平常玩撲克牌時(shí)將接到的牌插入到指定的位置)
(1)控制排序的次數(shù),保存需要插入的值。
(2)將大的元素向后移,找到合適的位置。
(3)將元素插入指定位置,然后繼續(xù)執(zhí)行上述操作。
(4)這里需要注意在找的時(shí)候可能會(huì)到最前面,需要注意數(shù)組越界問題。
代碼實(shí)現(xiàn):
//插入排序(升序) public static void insertSort(int[] arr){ //排序的次數(shù) for(int i=1;i=0 && arr[k]>end){//尋找需要插入的位置 arr[k+1]=arr[k]; k--; } arr[k+1]=end;//將元素是插入到指定的位置 } }
(1)時(shí)間復(fù)雜度:O(N^2)
?(2)空間復(fù)雜度:O(1)
執(zhí)行過程中沒有借助輔助空間。
(3)什么是穩(wěn)定性
(4)穩(wěn)定性:穩(wěn)定?? ? ??
適合于基本有序的數(shù)組或者數(shù)據(jù)量特別小的數(shù)組,因?yàn)榛居行?,那么中間進(jìn)行比較的次數(shù)就會(huì)減少。
如果需要排序的數(shù)字量特別多而且比較凌亂,而且還需要使用插入排序,這時(shí)候就有了希爾排序。
先選定一個(gè)合適的距離,然后以該距離為分割長度,依次對(duì)該距離的所有元素進(jìn)行插入排序,然后再縮小這個(gè)距離,直到距離為1時(shí)結(jié)束。
?
這里每次對(duì)于gap間距的值為gap=gap/3+1來處理
public static void shellSort(int[] arr){ int gap=arr.length; while(gap>1){ gap= gap/3+1; for(int i=gap;i=0 && arr[k]>end){ arr[k+gap]=arr[k]; k-=gap; } arr[k+gap]=end; } } }
(1)時(shí)間復(fù)雜度
如果gap選取的不同,則時(shí)間復(fù)雜度就,對(duì)于希爾排序,時(shí)間復(fù)雜度沒有一個(gè)確定的值,當(dāng)前增量法的時(shí)間復(fù)雜度大致為O(N^1.25)到O(1.6N^1.25)之間。
(2)空間復(fù)雜度????????
????????O(1)
(3)穩(wěn)定性分析
由于每次都時(shí)間隔排序,所以不穩(wěn)定
對(duì)于數(shù)據(jù)量特別大,數(shù)字比較凌亂的情況下,而且還需要使用插入排序的情況下,可以使用希爾排序來進(jìn)行處理。
每次選擇一個(gè)最大的數(shù)放在數(shù)組的末尾(或者每次選擇一個(gè)最下的放在數(shù)組頭,起始位置后移),然后數(shù)組長度-1,接著使用該方法,直到所有的元素排序完成即可。
//選擇排序(每次選最大的元素放在數(shù)組末尾) public static void selectSort(int[] arr){ for(int i=0;i
(1)時(shí)間復(fù)雜度
每一個(gè)元素都與前n-i-1個(gè)元素進(jìn)行比較,所以時(shí)間復(fù)雜度為O(N^2)
(2)空間復(fù)雜度
沒有額外空間的開辟,所以空間復(fù)雜度為O(1)
(3)穩(wěn)定性
由于每次都是間隔進(jìn)行交換,所以相同的元素最后位置可能會(huì)改變,所以不穩(wěn)定。
由于時(shí)間復(fù)雜度不好,平時(shí)應(yīng)應(yīng)用的比較少。
堆排序)是指利用堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。它是通過堆來進(jìn)行選擇數(shù)據(jù)。需要注意的是排升序要建大堆,排降序建小堆。
?
認(rèn)識(shí)優(yōu)先級(jí)隊(duì)列與堆_小白 菜的博客-CSDN博客
(1)時(shí)間復(fù)雜度
因?yàn)槎雅判蛳喈?dāng)于刪除元素,所以刪除需要N次,然后每次向下調(diào)整最壞為二叉樹的層數(shù)為,
所以時(shí)間復(fù)雜度為O(N*)
(2)空間復(fù)雜度
????????O(1)
(3)穩(wěn)定性
?由于間隔進(jìn)行交換,所以不穩(wěn)定。
需要前k個(gè)最大或最小元素時(shí),或者與其他排序一塊使用
大的元素向下沉,小的元素向上浮。
//冒泡排序 public static void bubbleSort(int[] arr){ //冒泡的趟數(shù) for(int i=0;iarr[j+1]){ swap(arr,j,j+1);//交換2個(gè)元素 flag=true; } } //沒有再進(jìn)行交換則退出 if(!flag){ return; } } } public static void swap(int[] arr,int left,int right){ int tmp=arr[left]; arr[left]=arr[right]; arr[right]=tmp; }
(1)時(shí)間復(fù)雜度
O(N^2)
(2)空間復(fù)雜度
O(1)
(3)穩(wěn)定性
沒有間隔進(jìn)行交換,所以穩(wěn)定
基本不使用
任取待排序元素序列中的某元素作為基準(zhǔn)值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準(zhǔn)值,右子序列中所有元素均大于基準(zhǔn)值,然后最左右子序列重復(fù)該過程,直到所有元素都排列在相應(yīng)位置上為止。
原理:以基準(zhǔn)值為中心,將區(qū)間劃分為左邊的值都小于基準(zhǔn)值,右邊的值都大于基準(zhǔn)值,直到所有元素有序即可。
?
?
?4.代碼實(shí)現(xiàn)
如果遞歸深度過深,我們可以對(duì)遞歸到小區(qū)間的時(shí)候使用插入排序,這樣可以提高排序速度,這樣也是對(duì)快排進(jìn)行優(yōu)化。
//使用三數(shù)取中法選擇合適基準(zhǔn)值,對(duì)快排優(yōu)化 public static int midDiv(int[] arr,int left,int right){ int mid = left+(right-left)>>1; //在左右值比較后然后中間值與左右進(jìn)行比較 if(arr[left]arr[right-1]){ return right-1; }else{ return mid; } }else {//左大右小 if(arr[mid]arr[left]){ return left; }else { return mid; } } }//前后指針法,劃分區(qū)間,得到基準(zhǔn)值 public static int partiton(int[] arr,int left,int right){ int prev=left-1; int cur = left; int midDiv=midDiv(arr,left,right);//找合適基準(zhǔn)值的位置 swap(arr,midDiv,right-1);//基準(zhǔn)值位置與最后元素交換 int div = arr[right-1]; while(cur1){ int div = partiton(arr,left,right);//找基準(zhǔn)值劃分區(qū)間 //左[left,val) quickSort(arr,left,div); //右[val+1,right) quickSort(arr,div+1,right); }
(1)時(shí)間復(fù)雜度
注意:對(duì)于未選擇三數(shù)取中的方法時(shí),最壞的時(shí)間復(fù)雜度為O(N^2),這是因?yàn)榭赡苊看蝿澐值臅r(shí)候左邊的都比最后一個(gè)小,相當(dāng)于每次只能排好一個(gè),每一個(gè)需要的時(shí)間大概為N,共有N個(gè)元素,所以為O(N^2),但是當(dāng)每次最后一個(gè)數(shù)都為中間值的時(shí)候,時(shí)間復(fù)雜度就變?yōu)镺(*N),為遞歸的深度。
通過優(yōu)化后最終得到的時(shí)間復(fù)雜度為O(*N)
(2)空間復(fù)雜度
在遞歸的時(shí)候借助了輔助空間,空間復(fù)雜度為遞歸的深度,所以空間復(fù)雜度為O()。
(3)穩(wěn)定性
間隔進(jìn)行了交換,所以不穩(wěn)定。
在數(shù)據(jù)特別隨機(jī)的時(shí)候使用快排比較高效
該算法是采用分治法(Divide andConquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。
·
?
?
public static void mergeSort(int[] arr,int left,int right,int[] temp){ if(right-left>1){ int mid = left+((right-left)>>1);//注意優(yōu)先級(jí)問題,否則會(huì)出現(xiàn)棧溢出 //分區(qū)間 mergeSort(arr,left,mid,temp); mergeSort(arr,mid,right,temp); //(合區(qū)間)將劃分好的區(qū)間進(jìn)行有序合并 mergeData(arr,left,mid,right,temp); //將合并好的區(qū)間拷貝的原數(shù)組中 System.arraycopy(temp,left,arr,left,right-left); } } //負(fù)責(zé)將劃分好的區(qū)間進(jìn)行合并 public static void mergeData(int[] arr,int left,int mid,int right,int[] temp){ int leftT=left; int midT = mid; int index=left; while(leftT
5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析
(1)時(shí)間復(fù)雜度
O(*N)
(2)空間復(fù)雜度
這里分析空間復(fù)雜度的時(shí)候不能按照遞歸深度*合并次數(shù)來進(jìn)行計(jì)算,因?yàn)槊看芜f歸合并后,就將之前的空間釋放掉了,所以借助的空間只有之前的輔助空間用來存儲(chǔ)合并有序的數(shù),最終空間復(fù)雜度為O(N)
(3)穩(wěn)定性
在進(jìn)行歸并的時(shí)候沒有間隔,所以穩(wěn)定。
6.應(yīng)用場(chǎng)景
應(yīng)用于外部排序。
統(tǒng)計(jì)相同元素出現(xiàn)的次數(shù),然后根據(jù)統(tǒng)計(jì)的次數(shù)回收到原來的數(shù)組中即可。
對(duì)于數(shù)據(jù)特別集中在某個(gè)范圍內(nèi)時(shí),效率是很高的。
?
public static void countSort(int[] arr){ int size=arr.length; if(size==0){ return; } int max=arr[0]; int min=arr[0]; //獲取最大最小值 for(int i=1;imax){ max=arr[i]; } if(arr[i]
(1)時(shí)間復(fù)雜度
時(shí)間復(fù)雜度為:O(N),為元素的個(gè)數(shù)
(2)空間復(fù)雜度
空間復(fù)雜度為:O(Max-Min)
(3)穩(wěn)定性
沒有間隔交換穩(wěn)定
對(duì)于數(shù)字比較集中在某個(gè)區(qū)間范圍內(nèi)時(shí)排序效率比較高。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124498.html
摘要:今天,一條就帶大家徹底跨過排序算法這道坎,保姆級(jí)教程建議收藏。利用遞歸算法,對(duì)分治后的子數(shù)組進(jìn)行排序?;舅枷攵雅判蚴抢枚堰@種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為,它也是不穩(wěn)定排序。 ...
摘要:技術(shù)之類加載機(jī)制掘金類加載機(jī)制是語言的一大亮點(diǎn),使得類可以被動(dòng)態(tài)加載到虛擬機(jī)中。玩轉(zhuǎn)仿探探卡片式滑動(dòng)效果掘金講起本篇博客的歷史起源,估計(jì)有一段歷史了。 Java 技術(shù)之類加載機(jī)制 - Android - 掘金類加載機(jī)制是 Java 語言的一大亮點(diǎn),使得 Java 類可以被動(dòng)態(tài)加載到 Java 虛擬機(jī)中。 這次我們拋開術(shù)語和概念,從例子入手,由淺入深地講解 Java 的類加載機(jī)制。 本文...
閱讀 3481·2023-04-26 02:31
閱讀 3637·2021-11-23 09:51
閱讀 1299·2021-11-17 09:33
閱讀 2452·2021-11-16 11:45
閱讀 2581·2021-10-11 11:12
閱讀 2424·2021-09-22 15:22
閱讀 2727·2021-09-04 16:40
閱讀 2591·2021-07-30 15:30