基本排序演算法

2021-06-24 11:38:36 字數 4804 閱讀 2827

1 typedef int

datatype;

23 inline void swap(datatype &a, datatype &b)49

10/*

**********************************

11氣泡排序:

12每次將最小的數"冒"在最前面

13**********************************

*/14

void bubblesort(datatype array, int

length)

1524}25

}26}27

28/*

**********************************

29插入排序

30從後往前依次插入元素

31**********************************

*/32

void insertsort(datatype array, int

length)

33

4445 array[i+1] =key;

46}

4748}49

50/*

**********************************

51歸併排序

52分別對左右兩邊進行排序,然後合併,需要申請新的空間

53**********************************

*/54

static

void merge(datatype sortarray, int start, int middle, int

end)

55

7879

while(i !=leftlength)

80

8384

while(j !=rightlength)

85

8889

free(leftarray);

90free(rightarray);

91}

9293

static

void _mergesort(datatype array, int start, int

end)

94102

}103

104void mergesort(datatype array, int

length)

105108

109/*

**********************************

110快速排序演算法,和歸併排序相比,快速排序不需要額外的空間

111**********************************

*/112

//將陣列劃分為2組,左邊的都比中間元素小,右邊的都比中間元素大

113static

int partition(datatype sortarray, int start, int

end)

114

125126

} 127 swap(sortarray[middleindex+1

], sortarray[end]);

128129

return middleindex+1

; 130

} 131

132static

void _quicksort(datatype sortarray, int start, int

end)

133

140}

141142

void quicksort(datatype sortarray, int

length)

143146

147/*

**********************************

148計數排序

149計數排序的基本思想是對每乙個輸入元素x,確定

150出不小於x的元素個數。

151只適用於正整數

152**********************************

*/153

static

void _countingsort(datatype sortarray, datatype sortedarray, int

arraylength,datatype maxvalue)

154175

}176

177*/

178179

//重排

180/*

181從大到小,可保持穩定性,即具有相同值的元素

182在輸出陣列中的相對次序與他們在輸入陣列中的次序相同

183*/

184for(int i = 1; i != maxvalue+1; ++i)

185 countarray[i] += countarray[i-1]; //

小於或等於的個數

186187

for(int i = arraylength-1; i != -1; --i)

188

194195

free(countarray);

196}

197198

void countingsort(datatype sortarray, int

length)

199205

206 datatype *sortedarray = (datatype *)malloc(length * sizeof

(datatype));

207 assert(null !=sortedarray);

208209

_countingsort(sortarray, sortedarray, length, maxvalue);

210211

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

212215

216free(sortedarray);

217218

}219

220/*

**********************************

221基數排序

222利用計數排序演算法,對陣列從低向高位排序

223**********************************

*/224

static

void countingsortforradixsort(datatype sortarray, datatype cmparray, int arraylength, int

maxvalue)

225

243244

for(int i = 0; i != arraylength; ++i)

245 sortarray[i] =sortedarray[i];

246247

free(countarray);

248free(sortedarray);

249250

} 251

252void radixsort(datatype sortarray, int

arraylength)

253

272if(true ==rsisok)

273break

; 274 countingsortforradixsort(sortarray, radixarray, arraylength, 9

);

275}

276277

free(radixarray);

278}

279/*

**********************************

280堆排序演算法

281堆: 可以視為一棵完全二叉樹,樹的每一層都是填滿的,除了最後一層

282其任何一非葉節點滿足性質:

283key[i]<=key[2i+1]&&key[i]<=key[2i+2]或者key[i]>=key[2i+1]&&key>=key[2i+2]

284285

堆排序演算法主要用於優先順序佇列

286**********************************

*/287

#define parent(x) ((x) >> 1) //

節點x的父節點下標號

288#define left(x) ((x) << 1) //

節點x的左子節點下標號

289#define right(x) (((x) << 1) + 1) //

節點x的右子節點下標號

290291

static

void maxheapify(int sortarray, int heap_size, int

parent)

292

312}

313314

static

void buildmaxheap(int sortarray, int

arraylength)

315

321322

void heapsort(int sortarray, int

arraylength)

323

333 }

基本排序排序演算法

時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...

基本排序排序演算法

時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...

基本排序演算法

將要排序的物件分作兩部份,乙個是已排序的,乙個是未排序的,從後端未排序部份選擇乙個最小值,並放入前端已排序部份的最後乙個,例如 排序前 70 80 31 37 10 1 48 60 33 80 1 80 31 37 10 70 48 60 33 80 選出最小值1 1 10 31 37 80 70 ...