1. 如何分析一個排序算法好壞
時間複雜度、比較和交換次數、原地排序(空間複雜度為(1))、排序穩定性(相等元素之間的位置先後順序不變)。
有序度:是數組中具有有序關係的元素對的個數
逆序度:和有序度相反。
選擇排序是不穩定排序,所以應用最少。
2. 插入排序比冒泡排序哪個好?
插入排序好。原因有如下兩點:
冒泡和插入雖然時間複雜度都是O(n2) ,元素移動次數都是等於逆序度,但是冒泡排序比插入排序多了三個賦值操作,性能有損耗,如下代碼://冒泡排序數據交換 if(a[j] >a[j+1]) { inttmp=a[j]; a[j] =a[j+1]; a[j+1] =tmp; flag=true; } //插入排序數據交換: if (a[j] >value) { a[j+1] =a[j]; }插入排序比冒泡排序有更多的優化空間,比如希爾排序。3. 常見的排序算法總結
4. 排序算法原理描述
冒泡排序移動相鄰位置的兩個數據,重複執行。插入排序把數組分為兩個區間,已排序和未排序區間。把數據從未排序區間插入已排序區間的合適位置。選擇排序分已排序和未排序區間,從未排序中找到最小的元素,放到已排序區間的額末尾。原地排序、不穩定排序、最好最壞平均時間複雜度都是O(n2)。歸併排序Merge Sort分治思想。假如把數組下標從x到y開始排序,不斷的把數組一分為二,直到x>=y,結束。然後merge。建立一個臨時數組,大小和要比較的數組大小相同,也就是A[x,y]。我們用兩個遊標 i 和 j,分別指向 A[x...q] 和 A[q+1...y] 的第一個元素。比較這兩個元素 A[i] 和 A[j],如果 A[i]<=A[j],我們就把 A[i] 放 入到臨時數組 tmp,並且 i 後移一位,否則將 A[j] 放入到數組 tmp,j 後移一位。繼續上述比較過程,直到其中一個子數組中的所有數據都放入臨時數組中,再把另一個數組中的數 據依次加入到臨時數組的末尾,這個時候,臨時數組中存儲的就是兩個子數組合併之後的結果了。最後再把臨時數組 tmp 中的數據拷貝到原數組 A[x...y] 中。穩定排序算法。時間複雜度都是O(nlogn) ,與原始數據是否有序無關。不是原地排序算法。快速排序 Quicksort從數組下標p到r,任意選一個數據作為pivot(分區點,一般選p到r最後一個),將小於pivot的數據放左邊,大於放右邊。然後將pivot左側和右側繼續按照此方式排序,直到區間為1。桶排序(Bucket sort)將數據分成若干個有順序的桶,每個桶內單獨排序,然後依次取出就是有順序了。計數排序(Counting sort)找出數組中最大的元素k,然後分成k個桶,每個桶內數據是相同的,桶之間就是排序好的數據。和桶排序的的大小力度不同。基數排序(Radix sort)對排序數據有要求,數據分隔不同的位,比較完前面的大小,數據後面的位數就不需要比較了。
如果讀完有收穫,歡迎關注[知否]公眾號,你也可以訪問官方網站[https://www.zhifou.net],更多精彩內容等著你!
推薦閱讀:
超詳細JVM虛擬機內存區域詳解
並發編程系列之 Synchronized原理分析
看過這篇「同步異步阻塞非阻塞詳解」,我徹底懂了
並發編程系列之Java內存模型(JMM)
JAVA中異常,你都理解了嗎?
面試中常問的單例設計模式
一文搞懂CAP理論
你應該知道的分布式事務之BASE理論
JAVA自學之路
點讚是最大的支持