排序演算法C 實現

2021-06-16 16:19:47 字數 2061 閱讀 3913

整理一下排序演算法。

首先乙個陣列,a=,我們先要從大到小經行排序

1.按照人們最直觀的思想,應該是一次次的遍歷,每次從裡面取最大的乙個,放到另乙個陣列裡面,這就是簡單選擇排序。

2.我們從第乙個值開始,跟其後面的值對比,如果後面的大,則與後面的交換。那麼每一次的結果就是最小被放到了最後,接著是第二小的唄放到了倒數第二,依次類推。經過n此之後,變為乙個有序陣列,這就是氣泡排序。

3.我們新建乙個陣列b,剛開始b的大小是0,我們依次從a中取出乙個數,放入b中。放的規則是,從b的第乙個到已有的最後乙個元素,乙個個與a中取出的數比較,直到b中某個數小於取出的數,我們就把取出的數放在其前面。也就是我們有序地用a去構造b,最後得到乙個有序陣列b。這就是直接插入排序。

4.兩路合併排序。兩路合併排序牽扯到分治演算法的思想。我們先把乙個大的陣列a,分為兩個小陣列,先把兩個小陣列有序後,再把兩個小陣列合併為大的有序陣列。相應的,這兩個小陣列也可以用這種思想繼續細分下去,知道只有乙個元素。兩路合併排序最後的方法就是,兩兩合併為大陣列,再遞迴兩兩合併,最後合併為有序陣列b。

5.快速排序。快速排序也是乙個分治思想的排序演算法,先取乙個元素作為key,按照這個key,把原陣列分為大於key的,和小於key的。然後作為兩個小陣列,繼續這樣劃分,直到只有乙個元素為止。

上面簡單介紹了5中排序演算法的基本思想,接下來程式設計實現,並計算其時間複雜度。

1.簡短選擇:

#includeusing namespace std;

void swap(int &a,int &b)

void f(int a,int n)//簡單選擇

} if(i!=key)

swap(a[i],a[key]);

} for(int i=0;i

#includeusing namespace std;

void swap(int &a,int &b)

void f(int a,int n)//冒泡

for(int i=0;i

3.直接插入:

#includeusing namespace std;

void swap(int &a,int &b)

void f(int a,int n)//冒泡

a[j+1]=temp;

} }for(int i=0;i4.兩路合併排序:

#includeusing namespace std;

void marge(int m,int temp,int n,int a)

else

}if(j>temp&&k<=n) }

if(j<=temp&&k>n) }

for(i=0;i

#includeusing namespace std;

#define max 999999;

void swap(int &a,int &b)

void f(int a,int m,int n)//快速排序

while(a[i]<=a[key]);

dowhile(a[j]>a[key]);

if(im)

f(a,m,j-1);

if(i

1.簡單選擇:每次遍歷一遍,假設每次對比一半搜尋到最小值,遍歷次數為(n+n-1+n-2+n-3.....+2+1)/2=(n+1)n/4,則時間複雜度為o(n^2);

2.氣泡排序:假設每次交換一半的個數,則交換次數為(n+n-1+n-2....+1)/2=(n+1)n/4,時間複雜度也是o(n^2);

3.直接插入排序:還是假設插入一次對比一半,(n+n-1+n-2...1)/2,再加上移動元素時間,每次移動也是一半(n+n-1+n-2...1)/2,則最後的時間複雜度為兩者相加,為(n+1)n/2,時間複雜度為o(n^2);

4.兩路合併排序:遞迴次數為logn,每次兩個子串行並在一起時間最多為兩路長度之和,2*l,而l的平均值為n/4,那麼合併的時間平均為n/2,那麼最後的總時間為(n/2)logn,也就是o(nlogn)

5.快速排序:類似於兩路合併,遞迴次數大概為logn,**子串行時間為n/2,於是時間複雜度為o(nlogn);

ps:上述程式為乙個上午所寫,圖快,沒有優化**。有時間在回來重新寫過,優化各個演算法。

C 實現排序演算法

資料結構中有六大經典的排序演算法,分別是氣泡排序 選擇排序 插入排序 歸併排序 快速排序和堆排序,以下是用c 實現的六大經典演算法的 1.氣泡排序 include include include using namespace std 一次氣泡排序 void bubble int arr,int s...

演算法 排序(C 實現)

1.氣泡排序 氣泡排序採用兩兩比較的方式。如果要由小到大排序,並且從前往後遍歷,那麼將大的往後放,第一重迴圈是比較幾輪,也就是陣列個數,第二重迴圈是從 0 到總數減去輪數。氣泡排序 void mybubble vector values 2.快速排序 快速排序就是選擇乙個基準資料,然後在陣列中 後前...

排序演算法 分配排序 C 實現

與之前的那些比較排序不同,分配排序在排序過程無須比較關鍵字,而是通過 分配 和 收集 過程來實現排序。它們的時間複雜度可達到線性階 o n 常見的分配排序有計數排序 counting sort 基數排序 radix sort 桶排序 bucket sort 美國旗幟排序 american flag ...