C 之排序演算法

2021-08-15 05:12:58 字數 2576 閱讀 9785

這是乙個新手的總結。

資料的排序方法有許多,這裡總結一下我所知道的。

一:選擇排序。

插入排序的時間複雜度最好的情況是已經是正序的序列,只需比較(n-1)次,時間複雜度為o(n),最壞的情況是倒序的序列,要比較n(n-1)/2次,時間複雜度為o(n^2 ) ,平均的話要比較時間複雜度為o(n^2 )。

插入排序適用於資料量小的時候,當資料量增大時就會過於消耗時間。

基本思想:每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在待排序的數列最前面,直到所有的待排序資料元素排完,需要用兩層迴圈。

方法步驟

1,讀入資料,存放在乙個陣列中,

2,從陣列a[1]~~a[n]中尋找最小(或最大)的元素與第一位的元素交換

3,從陣列a[2]~~a[n]中尋找最小(或最大)的元素與第二位的元素交換

......

直到第n-1各元素和最後乙個元素比較排序後結束。

**如下:

#includeusing namespace std;

int s[10002];

int main()

for(int i=1;i<=n;++i)

cout<<" "<

二:氣泡排序

氣泡排序的平均時間複雜度為o(n^2),但當輸入的資料已經是正序的序列時,只需比較(n-1)次,時間複雜

度為o(n)。

同樣氣泡排序適用於資料量少的時候,但大量資料時比較容易超時。

基本思想:比較相鄰的兩個元素的大小如果逆序就交換,一直到數列的最後,經過一次的比較能夠找出最大或最小的元素並放在正確位置,然後前面剩餘的元素重複這個過程,一直到比較最後兩個元素。這樣就像冒泡一樣將最大或最小的元素放到陣列的最後面。

方法步驟:(以公升序排列為例)

1,讀入資料,並存放在陣列中,

2,比較相鄰的前後兩個資料,如果前面的資料大於後面的資料,交換兩個資料。

3,對陣列所有元素進行一次遍歷後,最大的元素就好像冒泡一樣跑到了陣列的最後

4,對剩餘的元素重複上乙個的過程,直到剩下兩個元素比較結束。

**如下:

#includeusing namespace std;

int s[10001];

int main()}}

for(int i=0;i冒牌排序可以加乙個bool變數優化,見**:

bool ok;

for(int i=1;i<=n-1;++i)//進行n-1次迴圈,另一種寫法

}if(ok)

break;

}

這種優化減少了無用的迴圈次數。

三:插入排序

插入排序的平均時間複雜度與前兩種方法相同,時o(n^2)。當待排陣列有序時,此時複雜度為o(n),當待排陣列是逆序時,時間複雜度為o(n^2)。同樣對小資料量的運算占有優勢,另乙個優勢是可以對大小相同的元素進行元素元素下標排序。

基本思想:回憶一下打牌時的情景,一邊抓牌一邊將其放到合適的位置,當結束抓牌時手牌是有序的。正式一點就是說讀入乙個元素,尋找它的正確位置,將其放入,當不要忘了把後面的元素都要後移一位。

方法步驟:

1,讀入元素,放入陣列中,

2,從第二個元素開始判斷位置,將其放入,

3,迴圈上乙個過程,直到將最後乙個元素放入正確的位置。

詳細見**;

#includeusing namespace std;

int s[10001];

int main()

}for(int i=0;i

四:堆排序

堆排序的時間複雜度是最短的一種方法,只有o(n),但是對陣列空間的要求對於前四個要大,且只用於數字的排序。

基本思想:若待排序的元素的值在乙個明顯的範圍內,可將有限個相同的元素存放在乙個桶內,桶的序號就是元素的值。

方法步驟:

在輸入元素的同時,計算相同元素個數並將其儲存起來,

輸出時只要將每個元素按個數將「桶」的編號輸出即可。

詳細見**:

#include#include//memset(s,0,sizeof(s)) 用到

int s[101];

using namespace std;

int main()

for(int i=0;i<=100;++i)

}while(i<=j);//繼續尋找

if(j>l) qsort(l,j);//尋找到最後j==l,i==r

}int main()

else

}//下面這一步的意思是將剩餘的原本就符合條件的複製到a中排序

while(i<=mid)//把左邊的序列剩餘的從s複製到a

while(j<=t)//把右邊的序列剩餘的從s複製到s

for(int i=s;i<=t;++i)//將陣列返回

str[i]=a[i];

}int main()

{ int n;

cin>>n;

for(int i=1;i<=n;++i)

cin>>str[i];

msort(1,n);

for(int i=1;i<=n;++i)

cout《主要參考資料

(c++版)資訊學奧賽一本通

C 之排序演算法

衡量演算法的好壞指標,顯然首先這個演算法是正確的,除此之外,通常有三個方面的考慮 1 演算法在執行過程中所消耗的時間 2 演算法在執行過程中所佔資源的大小,例如,占用記憶體空間的大小 3 演算法的易理解性 易實現性和易驗證性等等。我們經常討論的時間複雜度是比較常見的評價標準之一。演算法的時間複雜度定...

C 排序演算法之氣泡排序

氣泡排序 思想 通過一系列的 交換 動作完成。首先第乙個記錄和第二個記錄比較,如果第乙個大,則二者交換,否則不交換 然後第二個記錄和第三個記錄比較,如果第二個大,則二者交換,否則不交換.一直按這種方式進行下去,最終最大的那個記錄被交換到了最後,一趟氣泡排序完成。這個過程中,大的記錄像一塊石頭一樣 沉...

C 排序演算法之堆排序

一 基本概念 堆 這裡是指一種資料結構,而不是我們在c 中提到的用於儲存引用型別物件的地方。它可以被當成一棵完全二叉樹lnemcgqax。為了將堆用陣列www.cppcns.com來存放,這裡對每個節點標上順序。事實上,我們可以用簡單的計算公式得出父節點,左孩子,右孩子的索引 parent i le...