常用排序演算法的C 實現

2021-09-24 23:46:01 字數 3809 閱讀 1457

放假沒事幹,複習複習,有空再用python寫一遍

#include#include#include#include#includeusing namespace std;

//氣泡排序

void bubblesort(vector& vec)

} if (sorted)

}}//選擇排序

void selectionsort(vector& vec)

} int tmp = vec[i];

vec[i] = vec[min];

vec[min] = tmp; }}

//簡單插入排序

void insertionsort(vector& vec)

vec[j + 1] = tmp;

} }}//歸併排序

void merge(vector& vec, int le, int mi, int ri)

else

}while (i < mi)

while (j < ri)

k = 0;

for (int i = le; i < ri; ++i) }

void mergesort(vector& vec, int le, int ri)

//排序區間[le,ri)

int mi = le + (ri - le) / 2;

if (le < mi - 1)

if (mi < ri - 1)

merge(vec, le, mi, ri);

}void mergesort(vector& vec)

//希爾排序

void shellsort(vector& vec)

int gap = len / 3 + 1;

do vec[j + gap] = tmp;

}} } while (gap>1);

}//最大堆排序

void maxheap(vector& vec,int root,int limit)

//對vec中小於limit內的值,將以root為根的子樹調整為堆(此處為最大堆)

//且假設只有root可能不在正確的位置上,其左右子樹都已經是最大堆

//預設陣列起始元素下標為1,方便計算

if (2 * root + 1 < limit && vec[largest] < vec[2 * root + 1])

if (largest != root) }

void create_maxheap(vector& vec)

}void heapsort(vector& vec)

}//快速排序

void quicksort_1(vector& vec, int le, int ri)

int x = vec[le]; //基準數,先儲存這個數,即先把le處挖個坑,找個數來填這裡

int i = le, j = ri - 1;

while (i < j)

if (i < j)

while (i < j && vec[i] <= x)

if (i < j)

}vec[i] = x;

//i==j,即最後剩乙個坑,用最開始的x來填,這樣i(j)左邊的都是小於x的,i(j)右邊的都是大於x的

//下面再對左右子串行遞迴快排

quicksort_1(vec, le, i);

quicksort_1(vec, i + 1, ri);

}void quicksort_1(vector& vec)

void quicksort_2(vector& vec,int le,int ri)

int x = vec[ri - 1]; //右邊界值作為基準數

int i = le - 1, j = le;

for (; j < ri-1; ++j) }

int tmp = vec[i+1];

vec[i+1] = vec[j];

vec[j] = tmp;

quicksort_2(vec, le, i+1);

quicksort_2(vec,i + 2, ri);

}//基數排序

void quicksort_2(vector& vec)

void basesort(vector& vec)

} int max_digits = 0;

while (max)

//max_digits是待排序數列中最長的位數

vector> bases(10, vector(len+1,0));

//每一行是乙個桶,行號對應桶號,每行最後一位記錄當前桶有幾個元素

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

//按桶號順序依次將資料複製回原陣列

int m = 0;

for (int j = 0; j < 10; ++j)

bases[j][len] = 0; //每行的計數字歸零

} }}//計數排序

void countingsort(vector& vec)

if (vec[i] > max)

}vectortemp(max - min + 1);

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

for (int i = 0, j = 0; i < max - min + 1; ++i) }

}void main()

int t1 = gettickcount();

bubblesort(vec);

cout <<"冒泡:"<< gettickcount() - t1 << "\n";

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

t1 = gettickcount();

selectionsort(vec);

cout << "選擇:"

t1 = gettickcount();

mergesort(vec);

cout << "歸併:"

t1 = gettickcount();

shellsort(vec);

cout << "希爾:"

t1 = gettickcount();

insertionsort(vec);

cout << "插入:"

t1 = gettickcount();

heapsort(vec);

cout << "堆排:"

t1 = gettickcount();

basesort(vec);

cout << "基數:"

t1 = gettickcount();

countingsort(vec);

cout << "計數:"

t1 = gettickcount();

quicksort(vec);

cout <<"快排1:"<< gettickcount() - t1<<"\n";

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

t1 = gettickcount();

quicksort_2(vec);

cout << "快排2:"<}

C 常用排序演算法的實現

最常用的演算法莫過於氣泡排序 選擇排序 插入排序 快速排序 歸併排序和希爾排序這幾種了。標頭檔案如下 ifndef sorting h define sorting h const static int sg count 10 void bubblesort int pdata,int count ...

常用排序演算法的C 實現

放假沒事幹,複習複習,有空再用python寫一遍 include include include include includeusing namespace std 氣泡排序 void bubblesort vector vec if sorted 選擇排序 void selectionsort ...

常用排序演算法 C實現

1.1 氣泡排序 演算法描述 所給的n個數中,先拿第乙個數來和第二個比較,然後讓較大的乙個排在後面 即如果n1 n2,則讓n1與n2交換位置 然後又拿第二個數來和第三個數比較,又把較大的乙個排在後面,如此往下做下去,直到第n 1個數和第n個數比較完後,最大的那個數就會被公升到了最後面來.接下來又照同...