-
快速行(最常見和最簡單的)。
演算法的想法是分而治之。
實施過程如上GIS19831203所述。
查詢樞軸(樞軸左側的樞軸小於樞軸,樞軸右側的樞軸大於樞軸),並且通過遞迴重複執行此操作。 ”
堆疊(不穩定,但解決某種型別問題的有效演算法思想)是一種時間複雜度為 n*(log2 n) 的演算法。
我不知道更快的演算法!!
資料的最大計算量為:
估計。。。。。。即使是這樣的演算法也需要幾十分鐘才能計算出來!!
除非你使用超級計算機......
起泡,插入......等於 n 2 個演算法。
別想了。
快速行要求提前讀取所有資料。
似乎沒有必要能夠乙個接乙個地讀取來建立乙個堆。
然後繼續操作,但堆也需要完整記錄。
鑑於您的最大資料量為 2 32!!
僅從空間角度來看,這並不令人滿意
儘管該演算法非常高效、快速且令人敬畏。
普通裝置也很難滿足您的最大資料要求。
對作業系統的要求也非常苛刻(推薦使用linix),c似乎自帶排序功能。
明白了。
默然。。。。。。在這種情況下,請使用快速排序演算法。
500,000 是一秒鐘(應該是瞬間的事情)。
您使用的演算法是 n 2 的演算法,這太慢了。
一般來說,這類問題所需的時間應該在兩者之間。
研究的知識點是時間複雜度為 n*(log2 n) 的排序演算法。
程式無法以有時限的方式測試所有資料。
建議使用快速測序演算法。
上網搜尋此類演算法的解釋。
找到你自己的解釋,然後學習......
-
你可以用冒泡法來嘗試,即連續放電兩個相鄰數字的大小。
-
上面提到的排序演算法都是通過比較實現的。 可以在沒有比較的情況下實現排序嗎? 是的,這就是計算和分類握把的神奇之處。
建立乙個計數陣列,使用陣列下標表示元素,並使用陣列下標對應的值來表示元素出現的次數。 然後遍歷 count 陣列。 例如,如果下標是 5,元素值是 2,則表示 5 出現兩次,5 可以連續寫兩次。
1.箱:
假設要排序的訂單的 arr 如下:
最大元素為 8,因此建立乙個最大下標為 8 的陣列:
遍歷要排序的序列,第乙個是 5,所以 count[5]++,第二個是 7,所以 count[7]++
最終的計數陣列為:
最後,根據計數陣列,我們可以知道 3 出現一次,4 出現一次,5 出現兩次,......出現您可以知道排序應如下所示:
這看起來很完美,但有兩個問題。
2.問題 1:
上面的 5 出現了兩次,最後乙個排序陣列中下標為 2 的 5 仍然是原始序列中下標為 0 的 5? 也就是說,當數值相同時,就沒有辦法保證排序後相同元素出現的順序與排序前相同,這就是我們所說的不穩定排序。 如何優化?
讓我們標記上乙個陣列中的兩個 5,以便更容易區分它們:
這樣,count 陣列就變成了:
3.問題 2:
假設現有的 to-be arr 如下所示:
如前所述,count 陣列的最大下標是 arr 陣列的最大值,即如果要對這四個數字進行排序,則需要建立乙個長度為 1001 的陣列。 而且,這些從0到994的空間沒有被使用,它們被浪費了。 因此,計數陣列的長度應為 max(arr) -min(arr) +1,即從最小值中減去最大值,然後加以 1。
在這種情況下,計數的長度為 1000 - 995 + 1 = 6,那麼每個元素應該放在哪個下標上呢? 從最小的元素中減去每個元素,結果值對應於 count 的下標。 例如,如果 999 - 995 = 4,則 999 應該對應於 count[4]。
4.計數排序的缺點:
從上面的分析中我們可以知道,計數排序是適用於資料分布相對集中的資料,即最大值和最小值相差不大,如果相差很大,會非常耗費空間。
-
選擇排序是一種簡單易實現的資料排序演算法。 以整數陣列元素為例,有陣列 a[10],即 a[0]、a[1] ,...A[8]、A[9](假設它們的元素彼此不同)。 要求其元素按增量排序。
以元素為參考從乙個方向開始掃瞄,例如從左到右,以 a[0] 為參考。
下乙個。。。從 a[0]。a[9] 並將其換成 a[0]。
然後將基準位置向右移動乙個位置並重複上述操作,例如,以 a[1] 為底,找到 a[1] a[9] 中的最小值並與 a[1] 交換。
當基準位置移動到陣列的最後乙個元素時,排序結束(此時,基準左側的所有元素都是遞增排序的,基準是最後乙個元素,因此排序完成)。
main()
int array[10];
初始化陣列!
int i,j,k,temp;
for(i=0;i<10-1;i++)="" }
-
我覺得太難了,就像我讀書的時候的排列組合問題,但仔細看,不是,對於數學成績不是很好的人來說,真的有點難,所以我先看書。
-
讓我們從快速排序中的最佳排序情況開始,在最好的情況下,每次我們分割槽時,我們會將乙個序列分成兩個幾乎相等的子序列,在這種情況下,每次遞迴呼叫它時,我們也會處理子序列大小的一半。 這看起來像乙個深度為 o(logn) 的完整二叉樹,因此您需要進行 o(logn) 巢狀呼叫。 但是,在同一層次結構中的兩個程式呼叫中,不會處理原始序列的同一部分。
因此,程式呼叫的每個層次結構總共需要 o(n) 時間。 因此,在最好的情況下,該演算法的時間複雜度為 o(nlogn)。
但是呼叫遞減資料進行遞增排序是快速排序中最糟糕的情況,您可以想象在每個分割槽之後都有乙個長度為 1 且 n-1 的子序列,這將導致我們的表示式變為:
t(n) =o(n) +t(1) +t(n-1) =o(n) +t(n-1)
這是時間複雜度,即 o(n)。
-
面試最基本的排序演算法。
-
1.背景。
在電腦科學和數學中,排序演算法是一種以特定排序方式排列資料串的演算法。
最常用的排序方法是數字順序和字典順序。
有效的排序演算法在某些演算法(例如,搜尋演算法和合併演算法)中很重要,因此可以正確回答這些演算法。
排序演算法還用於處理文字資料並生成人類可讀的輸出。
基本上,排序演算法的輸出必須遵循以下兩個原則:
1.輸出結果為遞增序列(遞增為所需排序順序);
2、輸出結果是對原輸入的排列或重組;
2.知識分析。
搜尋和排序演算法是對演算法的介紹,其經典思想可以應用於許多演算法。 由於其實現時間較短,因此應用程式更常見。 因此,在面試中,通常會詢問有關排序演算法及其相關問題的問題。
但是,只要您熟悉這些想法,靈活使用它們並不難。
一般來說,面試中最常見的測試是快速排序和氣泡排序,經常有面試官要求他們當場寫出這兩種排序。 這兩種**必須觸手可及。 除此之外,還有插入排序、氣泡排序、堆排序、基數排序、桶排序等。
3.常用演算法:
冒泡演算法,選擇排序,插入排序,山排序,合併排序,快速排序。
演算法特點:
1. 有限性:演算法必須確保在執行有限步驟後結束。
2. 確定性:演算法的每個步驟都必須精確定義。
3.輸入:乙個演算法有零個或多個輸入來描述操作物件的初始情況,所謂零輸入意味著演算法本身被賦予了初始條件。
4. 輸出:乙個演算法有乙個或多個輸出。 沒有輸出的演算法是沒有意義的。
5.可行性:演算法中執行的任何計算步驟都可以分解為基本的可執行操作步驟,即每個計算步驟都可以在有限的時間內完成(也稱為有效性)。
-
選擇d選擇排序,第一次行程完成後,必須是最小的,最大值在前面,所以第一次行程完成後沒有條件快速排序,左邊比他小,右邊比他大(反之亦然)。
在堆排序的第一趟之後,需要看看在建立完整的二叉樹後,編號為 1 的節點是如何調整的,可以發現答案不匹配。
合併順序是從小到大到合併子區間,可以發現子區間[1,2]、[3,4]、[5,6]、[7,8]都是有序的。
-
這些方法都差不多,新手可以看一看,主要是學習不同方法的思想。
這不是方法本身,而是你思考問題的方式。
沒有優點或缺點,這種演算法只是解決收斂問題的一種方法。 優缺點需要比較,沒有比較物件和相同的比較條件,怎麼談優缺點。 每個問題都可以解決許多演算法,迭代不一定是好是壞。 >>>More
隨著網民數量的增加,網友對優質網際網絡生態環境的渴望不斷擴大,憑空誕生的360搜尋,半年時間就搶占了10%以上的搜尋份額,實在是站不住腳。 在過去的一年裡,演算法更新變得越來越頻繁,每次更新前都會有批准,旨在為站長創造更好的使用者體驗,也給一些辛苦了的心頭人乙個後悔的機會。 在演算法更新以向使用者呈現更好的內容後,我將總結更新後SEO將走向何方。 >>>More