1 typedef intdatatype;
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 ...