插入,希爾,選擇,冒泡,堆排,快排,歸併,計數
c語言實現,並分析其時間,空間複雜度以及穩定性
#include
#include
#include
"sort.h"
#include
void
swap
(int
* array,
int i,
int j)
//插入排序
//時間複雜度 :最壞o(n^2) 最好o(n) 平均o(n^2)
//空間複雜度:o(1)
//穩定性:穩定
void
insertsort
(int
* array,
int n)
array[end+1]
=key;}}
//希爾排序
//時間複雜度 :最壞o(n^1.3) 最好o(n) 平均o(n^1.3)
//空間複雜度:o(1)
//穩定性:不穩定
void
shellsort
(int
* array,
int n)
array[end+step]
=key;
} step/=2
;}}//選擇排序
//時間複雜度 :最壞o(n^2) 最好o(n^2) 平均o(n^2)
//空間複雜度:o(1)
//穩定性:穩定
void
selectsort
(int
* array,
int n)
if(min!=i)
swap
(array,min,i);}
}void
selectsort2
(int
* array,
int n)
swap
(array,begin,min);if
(begin==max)
max=min;
swap
(array,end,max)
; begin++
; end--;}
}//氣泡排序
//時間複雜度 :最壞o(n^2) 最好o(n) 平均o(n^2)
//空間複雜度:o(1)
//穩定性:穩定
void
bubblesort
(int
* array,
int n)
if(flag)
break;}
}//堆排序
//時間複雜度 :o(nlgn)
//空間複雜度:o(1)
//穩定性:不穩定
void
shiftdown
(int
* array,
int n,
int parent)
else
break;}
}void
heapsort
(int
* array,
int n)
int size=n;
for(i=
0;i//快速排序
//時間複雜度 :最壞o(n^2)--優化後不會出現 最好o(nlgn) 平均o(nlgn)
//空間複雜度:o(lgn) 函式呼叫棧 最壞o(n)不會出現
//穩定性:不穩定
intgetmid
(int
* array,
int begin,
int end)
}else}}
intpartion
(int
* array,
int begin,
int end)
array[begin]
=key;
return begin;
}int
partion2
(int
* array,
int begin,
int end)
swap
(array,begin,start)
;return begin;
}int
partion3
(int
* array,
int begin,
int end)
swap
(array,begin,prev)
;return prev;
}void
quicksort
(int
* array,
int begin,
int end)
//棧實現非遞迴
void
quicksortnor
(int
* array,
int n)
while
(stackempty
(&st)!=1
)//左區間:begin--keypos
if(begin}}
//用佇列實現非遞迴
void
quicksortnor2
(int
* array,
int n)
while
(queueempty
(&q)!=1
)//右區間 keypos+1--end
if(keypos+
1//歸併排序
//時間複雜度 :o(nlgn)
//空間複雜度:o(n)
//穩定性:穩定
//合併兩個有序的子區間:begin--mid mid+1--end
void
merge
(int
*array,
int* tmp,
int begin,
int mid,
int end)
while
(begin1<=end1)
tmp[idx++
]=array[begin1++];
while
(begin2<=end2)
tmp[idx++
]=array[begin2++];
for(i=
0;ivoid
mergesortr
(int
* array,
int* tmp,
int begin,
int end)
}void
mergesort
(int
* array,
int n)
}//非遞迴實現
void
mergesortnor
(int
* array,
int n)
k*=2
;}}//計數排序
//時間複雜度 :o(max(n,range))
//空間複雜度:o(range)
//穩定性:一般教材上認為是穩定
void
countsort
(int
* array,
int n)
int range=max-min+1;
int* countarr=
(int*)
malloc
(sizeof
(int
)*range)
;memset
(countarr,0,
sizeof
(int
)*range)
;for
(i=0
;i)int idx=0;
for(i=
0;ifree
(countarr)
;}
資料結構八大排序演算法
常見的八大排序演算法,他們之間關係如下 直接插入排序 definsert sort l 遍歷陣列中的所有元素,其中0號索引元素預設已排序,因此從1開始 for x in range 1 len l 將該元素與已排序好的前序陣列依次比較,如果該元素小,則交換 range x 1,1,1 從x 1倒序迴...
資料結構八大排序
不穩定排序 一 選擇排序 例如 4 1 8 21 0 i j 0 4 8 21 1 將i的值存放到minindex中 arr j tmp 比較minindex和tmp的值 最後互換 void select sort int arr,int len 三 直接插入排序 穩定的演算法 無序 o n 2 有...
八大排序演算法的實現 C語言
1.插入排序void insertsort int arr,int size else arr end 1 tmp 2.希爾排序void shellsort int arr,int size else arr end gap tmp if gap 1 3.選擇排序int swap int a,int...