基於陣列的排序演算法

2021-08-03 19:51:50 字數 3166 閱讀 4013

上次已經對幾種排序演算法進行了分析,接下來對剩餘的幾種排序演算法進行分析,以及給出測試函式。

int

*get_arr(int len)

return arr;

}

5,希爾排序

空間複雜度:o(1) 時間複雜度:o(n^1.35)/o(n^1.5)

思路:將待排序陣列按照步長gap進行分組,然後將每組的元素利用直接插入排序的方法進行排序;每次將gap折半減小,迴圈上述操作;當gap=1時,利用直接插入,完成排序。

static void shell(int *arr,int

len,int gap)

arr[j+gap] = arr[j];

}arr[j+gap] = tmp;

}}void shell_sort(int *arr,int

len)

6,快速排序

空間複雜度:o(logn) 時間複雜度:o(n*logn)

思路:挖坑填數+分治法。從序列當中選擇乙個基準數,在這裡我們選擇序列當中第乙個數最為基準數,將序列當中的所有數依次遍歷,比基準數大的位於其右側,比基準數小的位於其左側,重複步驟1.2,直到所有子集當中只有乙個元素為止。

//遞迴形式快速排序

int partition(int *arr,int left,int right)

arr[left] = arr[right];

while(arr[left] <= tmp && left < right)

arr[right] = arr[left];

}arr[left] = tmp;

return left;

}void quick(int *arr,int left,int right)

}void quick_sort(int *arr,int len)

//非遞迴形式快速排序

void quick_sort_stack(int *arr,int len)

if(right > base+1)

}free(stack);

}

7,堆排序

空間複雜度:o(1) 時間複雜度:o(n*logn)

堆:本質是一種陣列物件。特別重要的一點性質:任意的葉子節點小於(或大於)它所有的父節點。對此,又分為大頂堆和小頂堆,大頂堆要求節點的元素都要大於其孩子,小頂堆要求節點元素都小於其左右孩子,兩者對左右孩子的大小關係不做任何要求。

利用堆排序,就是基於大頂堆或者小頂堆的一種排序方法。

static void heap_adjust(int *arr,int start,int end)

if(tmp > arr[i])

else

if(tmp else

//tmp == arr[i]

start = i;

}arr[start] = tmp;

}void heap_sort(int *arr,int

len)

swap(&arr[0],&arr[len

-1]);

for(int k = len

-1;k>0;k--)

}

8,歸併排序

空間複雜度:o(n) 時間複雜度:o(n*logn)

思路:通過序列中各個元素的值,對排序的n個元素進行若干趟的「分配」與「收集」來實現排序。

分配:我們將l[i]中的元素取出,首先確定其個位上的數字,根據該數字分配到與之序號相同的桶中

收集:當序列中所有的元素都分配到對應的桶中,再按照順序依次將桶中的元素收集形成新的乙個待排序列l[ ]對新形成的序列l重複執行分配和收集元素中的十位、百位…直到分配完該序列中的最高位,則排序結束。

void meger(int *arr,int

len,int gap)

else

if(arr[l1] > arr[l2])

}while(l1 <= h1)

while(l2 <= h2)

l1 = h2+1;

h1 = l1+gap-1;

l2 = h1+1;

h2 = l2+gap-1

< len ? l2+gap-1 : len-1;

}while(l1 < len)

for(int i = 0;i

free(buff);

}void meger_sort(int *arr,int

len)

}

測試用例:

#include"sort.h"

#includeint main()

; int

len = sizeof(arr)/sizeof(arr[0]);

/*int *arr = get_arr(100000);

int len = 100000;

*///exchange_sort (arr,len);

//show(arr,len);

//bubble_sort(arr,len);

//show(arr,len);

//bubble_sort_ex(arr,len);

//show(arr,len);

//select_sort(arr,len);

quick_sort(arr,len);

//show(arr,len);

quick_sort_stack(arr,len);

//shell_sort(arr,len);

meger_sort(arr,len);

show(arr,len);

/*insert_sort_ex(arr,len);

show(arr,len);*/

return

0;}

最後,對幾種排序演算法進行比較:

排序演算法的分類

排序演算法效能比較

基於陣列的排序演算法

在完成各個排序的 前,先完成乙個交換函式和列印函式。void show int arr,int len printf n 交換函式 static void swap int p,int s sort.h中的函式宣告 ifndef sort h define sort h void exchange ...

各種排序演算法總結 基於陣列

寫 前,將這些演算法分步驟建立模型,就好寫了 1 氣泡排序 氣泡排序是非常容易理解和實現,以從小到大排序舉例 設陣列長度為n。比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。這樣對陣列的第0個資料到n 1個資料進行一次遍歷後,最大的乙個資料就 沉 到陣列第n 1個位置。n n ...

基於整型陣列的幾種基本的排序演算法

一 選擇排序 排成從小到大的順序 不穩定,時間複雜度 最差 平均都是o n2 1.演算法思路 找出陣列中最小的數與第乙個數進行交換 找出陣列中第二小的數與第二個數進行交換 依此類推,直到陣列排序完畢.2.例子 void selectsort int arr,int length 三 直接插入排序 排...