關於排序的總結和部分實現(個人理解整理版)

2021-07-11 00:17:39 字數 2771 閱讀 4210

因為找實習,很多公司都要看技術部落格,大部分筆記,bug修復之類的都寫在印象筆記上,現在開始往上面搬。

不穩定排序:堆排,希爾,快排,選擇排序

時間複雜度達到o(nlogn)的排序:堆排,快排,希爾,歸併(神奇)

如果不考慮空間消耗,桶排是最快的

如果不考慮太多的空間消耗,堆排和歸併一樣快

如果考慮空間消耗,堆排更快一點。

如果實現有困難,比如不好建堆,不好劃分歸併,可以使用快排。

陣列比較小的時候,會選擇插入排序,陣列比較大的時候快排。

快速排序(是氣泡排序的進化型)*因為快速排序和氣泡排序都是交換排序

氣泡排序的最好時間複雜度o(n),最壞o(n^2),因為氣泡排序是就地排序,所以它是穩定的。

氣泡排序:1.從無序區r[1...n]開始向上比較(從n開始)相鄰兩個氣泡的重量,如果發現問題,交換兩者的位置。這樣置換之後,可以確定乙個最輕的氣泡,現在r有序和r【2...n】無序

2.開始第二次掃瞄,掃瞄完畢時,倒數第二輕的氣泡已經確定位置了。

3.最後經過n-1次掃瞄可以得到乙個有序的排列。

4.如何確定排序是否已經有序:給乙個布林量exchange,在每趟排序開始之前,將其設定為flase,如果發生交換設定為true,如果已經有序,必然不會發生交換,最後檢查一下設定是否為flase時就停止。

int i,j;

for(i=0;i

for(j=0;i+j

} return a;

快排平均情況下o(nlogn),最壞的情況下o(n^2),空間複雜度o(logn)

快速排序:分為兩個部分,第一是快排的劃分思想,第二是基準點的劃分方法。

基準點的劃分方法:1.設定指標i(開始指向下界)和指標j(開始指向上界),選取無序區的第乙個記錄r[i]作為基準記錄。將它儲存在pivot中

2.令j從高位開始掃瞄,直到掃瞄到比pivot小的記錄a,交換a和pivot,此時r[i]等於a,r[j]等於pivot

然後從低位開始掃瞄,直到找到乙個比pivot大的記錄b,交換b和pivot,此時r[j]等於b,r[i]等於pivot

3.直到i=j時,r[i]=r[j],此時pivot的最終位置確定,講pivot放在此位置上完成一次劃分。

然後再進行快排,首先分治劃分,然後求解,求解借書時,左右已經有序,不需要組合。

插入排序最差平均都是o(n^2),最好是o(n)

插排就是把沒順序的,和有順序的進行比較,然後按順序插入即可。

int i,j;

int temp=0;

for(i=0;i

} }

return a;

希爾排序(希爾排序是插入排序的一種),時間複雜度o(nlogn),空間複雜度1

成敗在於步長的選擇策略。

概念:增量序列,比如5,3,2,1,這裡指的是吧步長,標示第乙個數和第六個數比較後排序,第二個數和第7個數比較排列,這是第一輪

第二輪,第乙個數和第四個數比較排列,第二個數和第五個數比較排列,這是第二輪

第三輪第四輪以此類推。

有一種說法是步長需要一直進行比較。

桶排的時間複雜度o(n),空間o(k),典型的空間換時間

桶排序:桶排首先要有個桶,假設資料是23558,假設有10個空桶

對於這是個空桶,讀入乙個2,2號桶+1,讀入3,三號桶+1,讀入5,5,5號桶加1加1,讀入8,八號桶+1,這樣順序輸出即可。

時間複雜度o(dn),空間複雜度是o(n)

基數排序:和桶排有點相似,不過先排個位,排完重新組序,然後再排十位,排完從新組序號。先排的先輸出是基本要領。

計數排序,就是桶排

歸併排序時間複雜度最好最壞平均都o(nlogn),時間複雜度o(1)

堆排序:堆排開始的時候必須將堆調節成大根堆或者小根堆,將最大數或者最小數從堆頂取出。

取出後,剩下的堆再次進行調整。再從當前大根堆中取出堆頂,直到取完所有的值。

歸併排序時間複雜度最好最壞平均都o(nlogn),時間複雜度o(n)

歸併排序:@1.自底向上(效率高,但是可讀性差)

自底向上的基本思想是:第1趟歸併排序時,將待排序的檔案r[1..n]看作是n個長度為1的有序子檔案,將這些子檔案兩兩歸併,若n為偶數,則得到

個長度為2的有序子檔案;若n為奇數,則最後乙個子檔案輪空(不

參與歸併)。故本趟歸併完成後,前

個有序子檔案長度為2,但最

後乙個子檔案長度仍為1;第2趟歸併則是將第1趟歸併所得到的

個有序的子檔案兩兩歸併,如此反覆,直到最後得到乙個長度為n的有序檔案為止。

上述的每次歸併操作,均是將兩個有序的子檔案合併成乙個有序的子檔案,故稱其為"二路歸併排序"。類似地有k(k>2)路歸併排序。

@2.自頂向下

①分解:將當前區間一分為二,即求**點

②求解:遞迴地對兩個子區間r[low..mid]和r[mid+1..high]進行歸併排序;

③組合:將已排序的兩個子區間r[low..mid]和r[mid+1..high]歸併為乙個有序的區間r[low..high]。

遞迴的終結條件:子區間長度為1(乙個記錄自然有序)。

選擇排序:思想是遍歷一遍,然後選擇最小的或者最大的放到前面,故最壞或者平均都是o(n^2),主要用來評估排序演算法。

class selectionsort

temp=a[m-1];

a[m-1]=a[max];

a[max]=temp;

m--; }

return a; }

};需要筆記分享的,可以發郵件到我郵箱,[email protected],寫明需要哪一章,謝謝。

關於Java nofity wait的個人理解

首先notify,wait的經典場景是生產者,消費者模型 importorg.slf4j.logger created by wcl on 17 9 17.public classconsumerimplementsrunnable public voidrun 消費 1,當前數量 name,con...

cookie和session的個人簡單理解

瀏覽器 客戶端發起請求 伺服器響應 setcookie要求瀏覽器 客戶端生成乙個cookie 瀏覽器 客戶端儲存cookie,並在下次請求中在請求頭中傳送這個cookie 伺服器識別這個瀏覽器發來的cookie,證明是同一使用者 這個使用者請求相同的伺服器都會傳送這一cookie重複3 5步,伺服器...

cookie和session的區別,個人理解

今天在刷牛客網前端面試題庫時,突然看到乙個問題,cookie和session的區別?說實話這個我還真沒想過,可是牛客網給的解釋卻很模糊。看的我一頭霧水 cookie是由伺服器端生成,傳送給user agent 一般是瀏覽器 伺服器告訴瀏覽器設定一下cookie 瀏覽器自動會將cookie以key v...