上次已經對幾種排序演算法進行了分析,接下來對剩餘的幾種排序演算法進行分析,以及給出測試函式。
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 三 直接插入排序 排...