資料結構 八大排序演算法c語言實現

2021-10-06 02:50:57 字數 3898 閱讀 5324

插入,希爾,選擇,冒泡,堆排,快排,歸併,計數

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...