排序問題C

2021-09-06 08:41:46 字數 3645 閱讀 8687

雖臨近期末考試,但仍要總結一下各種排序演算法。

以下預設全部為公升序排序(從小到大)

如果一種排序演算法能夠保證同值元素之間的相對次序不變則稱為穩定排序

選擇排序的方法十分簡單。第i次搜尋,搜尋從第i個元素到第n個元素中的最小值,將其放到第i的位置上。(將原來第i位置的元素與後面的最小值進行交換即可)

依次迴圈,迴圈到最後乙個元素,即可終止演算法。

演算法思路的核心就是每次選擇最小的,放到前面對應的位置。這樣整個序列就分為前面排好序的序列和後面待排序的序列。

很明顯複雜度在o(n

2)

o(n^2)

o(n2

)級別上。

實現**

void

select_sort

(int

* element,

int n)

}swap

(element[min]

,element[i]);

//let the minnest value to ith

}}

選擇排序是搜尋後方最小的元素直接放到前面的某個位置,此時這個值就在這個位置,在後續搜尋過程中也不會變化。

而插入排序,是在遍歷序列的過程中,始終保證到搜尋點前端序列是有序的。這樣直到最後乙個元素,插入前n-1個序列中,就保證了前n個元素序列是有序的。

實現**

void

insert_sort

(int

* element,

int n)

}}

氣泡排序每次從頭開始遍歷整個序列,每一次遍歷,從開始的元素依次向後比較,兩兩進行比較,將大的元素放到後邊。這樣每一次迴圈都會將乙個最大元素放到後面(第一次將最大的元素放到第n位置,第二次將次大的元素放到n-1的位置,依次進行),這就就保證後面的序列是有序的,當執行n次迴圈時,那倒數n個的序列都有序,即整個序列有序

這個演算法相當於插入排序的乙個倒序過程。

插入排序保證前面是有序的

氣泡排序保證後面是有序的。而且還保證了每一次放到第i位置的元素就是第i大,之後的迴圈不會影響它的位置了。(這就與選擇排序部分相似)

實現**

void

bubble_sort

(int

* element,

int n)

}}

基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優先順序排序。最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。

首先確定需要比較的位數(通過最大值確定),然後依次從低位進行比較。每個位數的比較通過計數排序獲得。

計數排序中最巧妙地部分在於

//very important

for(

int i=

1;i<

10;i++

)

通過累計求和可以很方便的確定第i個元素應當在有序陣列的中的位置。

實現**

void

count_sort1

(int

* element,

int n,

int exp)

//very important

for(

int i=

1;i<

10;i++

)//cause the result list

for(

int i=n-

1;i>=

0;i--

)//make the result to element

for(

int i=

0;ivoid

radix_sort

(int

* element,

int n)

//count sorting according to each order

for(exp=

1;maxx/exp>

0;exp=exp*10)

return

;}

堆排序主要用最小堆的性質,每次取出最小元素放到有序陣列中。

當然也可以直接在element元素中手動實現最大堆(先進行初始化,再依次取出最大元素放到(陣列末尾−i-i

−i)的位置,直到最後整個陣列就是從小到大的有序陣列。)

void

stack_sort

(int

* element,

int n)

return

;}

將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。 作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。

void

count_sort

(int

* element,

int n,

int maxx)

//counting

for(

int i=

0;i)//cause new list

int index=0;

for(

int i=

0;i<=maxx;i++)}

delete

record;

}

快速排序的主要思想就是每次將待排序的序列分成兩部分,前一部分的序號都小於後一部分,之後分別對著兩部分進行排序。

詳細**:快速排序

首先需要挑出乙個作為基準,重新排序序列,把所有比基準小的數放到基準的前面,把所有比基準大的數放到基準的後邊。

完成操作後,即將排序分成了兩部分。然後遞迴進行即可。

template

<

typename t>

void quick_sort

::quicksort

(int left,

int right)

//find the element smaller than temp at right series

while

(element[i]

<=temp&&i//find the element bigger than temp at left series

if(i}//change the middle and the start element

element[left]

=element[i]

; element[i]

=temp;

quicksort

(left,i-1)

;quicksort

(i+1

,right)

;}

C 奧運排序問題

按要求,給國家進行排名。有多組資料。第一行給出國家數n,要求排名的國家數m,國家號從0到n 1。第二行開始的n行給定國家或地區的奧運金牌數,獎牌數,人口數 百萬 接下來一行給出m個國家號。排序有4種方式 金牌總數 獎牌總數 金牌人口比例 獎牌人口比例 對每個國家給出最佳排名排名方式 和 最終排名 格...

C語言 排序問題

有乙個檔名為num.txt的文字檔案,裡面有1千萬個隨機數,這些數字的大小在0 1億之間,儲存方式如下 5422232 23232 454345232 676575 要求 1.寫乙個程式來讀取這個檔案中的數字,並從大到小排序後以上面的格式儲存為 num b.txt 2.記憶體占用不可超過1mb 注意...

C語言 排序問題

有乙個檔名為num.txt的文字檔案,裡面有1千萬個隨機數,這些數字的大小在0 1億之間,儲存方式如下 5422232 23232 454345232 676575 要求 1.寫乙個程式來讀取這個檔案中的數字,並從大到小排序後以上面的格式儲存為 num b.txt 2.記憶體占用不可超過1mb 注意...