7種排序演算法的C 實現以及比較

2022-07-02 02:33:11 字數 3929 閱讀 8230

c++自帶排序:

#include

int list[1001];

sort(list,list + 1001);

預設從小到大排序,通過在第三個元素加上cmp,就可以從小到大排序。

排序可以分為內部排序外部排序兩種。

內部排序:待排序記錄存放在計算機隨機儲存器中(說簡單點,就是記憶體)進行的排序過程。

外部排序:待排序記錄的數量很大,以致於記憶體不能一次容納全部記錄,所以在排序過程中需要對外存進行訪問的排序過程。

衡量效率的方法

內部排序:比較次數,也就是時間複雜度

外部排序:io次數,也就是讀寫外存的次數

排序方法

內部排序:插入排序、快速排序、選擇排序、歸併排序、基數排序等

外部排序:,多路平衡歸併、置換-選擇排序

1、氣泡排序:

#include using

namespace

std;

int a[5] = ;

void swap(int arr, int x, int

y)void bubblesort(int arr, int

n) }

}}intmain()

return0;

}

2、選擇排序:

#include using

namespace

std;

int a[5] = ;

void swap(int arr, int x, int

y)void selectsort(int arr, int

n) }

}}intmain()

return0;

}

3、插入排序:

#include using

namespace

std;

int a[5] = ;

void swap(int arr, int x, int

y)void insertsort(int arr, int

n) arr[j + 1] = tempval; //

插入資料}}

intmain()

return0;

}

4、希爾排序:

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。插入排序是將未排序的數字插入到已排序數列中,而希爾排序是將乙個已排序的數列插入到另乙個已排序的數列中。

#include using

namespace

std;

int a[5] = ;

void swap(int arr, int x, int

y)void shellsort(int arr, int

n) arr[j + jump] =tempval;

}jump = jump >> 1; //

步長值減半}}

intmain()

return0;

}

5、歸併排序:

將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表

#include #include 

#include

using

namespace

std;

int a[5] = ;

void swap(int arr, int x, int

y)void _merge_in_arr(int arr, int left, int mid, int

right)

if (low > mid) //

證明左區間已經放完

break

;

while (hig <= right && arr[low] > arr[hig])//

證明右區間沒有合併完,且左區間的值大於右區間的值

} //到這一步,證明起碼有乙個區間已經合併完成

if (hig <= right) //

證明右邊沒有完成

memmove(&pdata[index], &arr[hig], sizeof(int)* (right - hig + 1

));

if (low <= mid) //

證明左邊沒有完成

memmove(&pdata[index], &arr[low], sizeof(int)* (mid - low + 1

));

//把所有區間都合併到了輔助區間

memmove(&arr[left], pdata, sizeof(int)*length);

free(pdata); //

釋放空間

}void mergesort(int arr, int left, int

right)

intmain()

return0;

}

6、桶(基數)排序:

桶排序是典型的空間換時間,在對整數排序中,速度非常快,但是非常耗記憶體

#include #include 

#include

using

namespace

std;

int a[5] = ;

void swap(int arr, int x, int

y)void radix_sort(int

arr, size_t len)

for (int i = 1; i <= 100; i *= 10)//

迴圈數值可能有的位數

}//arr陣列中的元素放入輔助陣列

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

//把輔助陣列的內容放回待排序陣列

int k = 0;//

待排序的下標

for (int x = 0; x < 10; x++)}}

//釋放記憶體

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

free

(temp);

}int

main()

return0;

}

我的dev甚至跑不出來這個的結果orz,最後還是用clion跑出來的。

7、快速排序:

將要排序的數列分割成獨立的兩部分,一部分資料比另一部分的資料都要小,整個排序過程可以遞迴進行。用到了二分的思想。

快速排序不是乙個穩定 的排序演算法

是對氣泡排序的改進,時間複雜度是o(nlogn).

目前被認為是最好的一種內部排序演算法。

#include using

namespace

std;

int a[5] = ;

void qsort(int le, int

ri)

while(a[j] > mid)

if(i <=j)

i++; j--; //

繼續找

}

/*分別遞迴繼續排序

*/if(le if(i }int

main()

return0;

}

BitCount兩種實現以及效率比較

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。一 第一種實現 這也是比較多人使用的一種演算法。public static int bitcount int i return count 二 第二種實現檢視integer類,發現其中提供了乙個bitcount介面,具體的實現如下 r...

srtlen實現以及與sizeof的比較

這裡僅為個人整理,大部分來自百科 一 strlen函式 strlen所作的僅僅是乙個計數器的工作,它從記憶體的某個位置 可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域 開始掃瞄,直到碰到第乙個字串結束符 0 為止,然後返回計數器值 長度不包含 0 1 用法 針對碰到第乙個字串結束 0 為...

7種常見排序演算法的c 實現

今天心血來潮複習了一下基本的排序演算法,實現了一下,就順便發上來咯。在 裡做了注釋了 也就不多說了,直接上 吧。order algorithm.cpp 定義控制台應用程式的入口點。author netbin include stdafx.h include iostream include incl...