最基本的排序方法 C語言

2021-10-09 22:00:42 字數 2935 閱讀 3938

不穩定排序

選擇排序

快速排序

經典的排序和查詢方法是每個人都要掌握的,為了更加深刻的記憶它們,我把排序方法記錄在這條菜鳥走向大神的羅馬大道上。希望這篇文章可以幫到更多的人。

這篇文章的初步分為穩定排序不穩定排序兩個部分,穩定又代表了什麼呢,下面有乙個陣列:

arr[5, 5, 2, 1, 3],裡面有兩個數值相等的5,我們加乙個符號標記不同位置的5。

經過穩定排序後:arr[1, 2, 3,5, 5] 發現他們的相對位置不改變;

而經過不穩定排序後(如快速排序)陣列就變成了arr[1, 2, 3, 5,5], 相同數字位置發生改變了。

插入排序的核心思想就是保證陣列的頭部有序,然後向後推進,直到遍歷完整個陣列。(下面所有**都是預設從小到大排序)

不失一般性,我們假設陣列的前 j - 1個元素已經有序,到了第 j 個元素,我們需要將它放到前 j 個位置適合它的位置, 每次跟它前面的元素比較,小於前面的元素則交換位置,否則就是目前位置

對於每乙個元素 j,最好的情況交換0次,最壞的話交換 j 次。

void

insert

(int

*num,

int n)

}return

;}

氣泡排序和插入排序相反,他是保證陣列後面有序。第一步是找到最大的數放在最後一為,迴圈n遍,每次找到未排序區間裡面的最大數,放在已排序區間的前面。實現即大於右邊的進行交換

對於氣泡排序,這裡有乙個加速的方法,防止有序的陣列再遍歷一遍。即使用乙個變數 times 記錄每次遍歷交換的次數,如果某一次沒有進行交換,則代表陣列已經完全有序,可以直接跳出迴圈。

void

bubble_sort

(int

*num,

int n)}}

return

;}

歸併排序的思想也很簡單,就是分治與合併,將乙個陣列一分為二,先把左邊的進行排序,然後把右邊的進行排序(分治),最後將兩個有序的陣列合併到乙個陣列中再拷貝到原陣列裡面。分別對兩個小陣列進行排序並不需要真正意義上的排序,我們利用遞迴將它分治成極小的陣列(只有乙個或兩個元素)再將有序的陣列合併即可。

void

merge_sort

(int

*num,

int l,

int r)

return;}

int mid =

(l + r)

>>1;

merge_sort

(num, l, mid)

;// 遞迴對左側陣列進行歸併排序

merge_sort

(num, mid +

1, r)

;// 遞迴對右側陣列進行歸併排序

int*temp =

(int*)

malloc

(sizeof

(int)*

(r - l +1)

);// 有序的陣列進行合併

int p1 = l, p2 = mid +

1, k =0;

while

(p1 <= mid || p2 <= r)

else

}memcpy

(num + l, temp,

sizeof

(int)*

(r - l +1)

);free

(temp)

;return

;}

每次選擇未排序區間最小值(最大值),然後和下乙個應該排序的位置的元素交換位置。

void

select_sort

(int

*num,

int n)

swap

(num[i]

, num[ind]);

// 和應該排序的位置i的元素交換位置

}return

;}

快速排序的思想就是找乙個基準值,把小於基準值的所有數放在基準值左側,大於基準值的所有數放在右側,遞迴到兩個小陣列直到所有都有序

void

quick_sort

(int

*num,

int l,

int r)

}while

(x <= y)

;// 基準值右側全是大於它的數,第一次快排結束

quick_sort

(num, x, r)

;// 對右側的區間遞迴塊排

r = y;

// 對左區間進行塊排(此時 l != r)

}return

;}

一更到此結束,下次更新各個排序演算法之間的複雜度問題

昨天晚上看到乙個很精彩的部落格,是關於優先佇列的,雖然之前會優先佇列,但是還是受益匪淺。文章最後的一段話也很有感觸,在此寫下來了,另外附上部落格的鏈結,需要的兄弟們可以進取看一看。

c++中優先佇列priority_queue的基礎用法

「人在比較中奮進,同在比較中消亡,

起初面臨差距時會奮起直追,但是當努力過後發現距離反而越來越遠時,

便會麻木懈怠,曾經的努力沒有用嗎?

我覺得不是,努力過不一定會成功,但是努力的過程已經印在了骨子裡,

這本身就是生活的一部分。

你可以選擇這條艱苦的路,同樣也可以選擇跳過,至於跳過時錯失了什麼,誰又知道呢?

畢竟人生無法再來過,重新讀檔只發生在遊戲世界中~」

最基本的Socket程式設計 C

說明 此示例在 net2005 xp 下執行通過 示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊 這裡只是乙個簡單的示例,是乙個最基本的 socket 程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。下面是示例程式的簡單...

最基本的Socket程式設計 C

下面是示例程式的簡單步驟說明 伺服器端 第一步 用指定的埠號和伺服器的 ip建立乙個 endpoint 對像 第二步 建立乙個 socket 對像 第三步 用 socket 對像的bind 方法繫結 endpoint 第四步 用 socket 對像的listen 方法開始監聽 第五步 接受到客戶端的...

維修電腦最基本的檢測方法

維修電腦最基本的檢測方法 掌握一些電腦維修的基本檢測方法,是解決電腦故障的必備基礎知識,如果你懂得這些知識也許當你的機器出現問題的時候不必馬上抱去維修站,自己就能解決,省事又方便.敲擊法機器在使用過程中如果出現時而正常時而不正常的情況,往往是由於插接不牢 焊點虛焊及接觸不良造成的。這時可用小橡皮錘輕...