1. 冒泡排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
#include <stdio.h>#define LENGTH 8 void
main() { int
i, j, tmp, number[LENGTH] = {95, 45, 15, 78, 84, 51, 24, 12}; for
(i = 0; i < LENGTH; i++) { for
(j = LENGTH - 1; j > i; j--) { if
(number[j] < number[j-1]) { tmp = number[j-1]; number[j-1] = number[j]; number[j] = tmp; } } } for
(i = 0; i < LENGTH; i++) { printf("%d ", number[i]); } printf("\n");} |

2. 快速排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 |
#include <stdio.h>int a[] = { 1, 2, 8, 7, 9, 5, 6, 4, 3, 66, 77, 33, 22, 11 }; /* 输出数组前n各元素 */void
prt(int
n){ int
i; for
(i = 0; i < n; i++) { printf("%d\t", a[i]); } printf("\n");} void
quick_sort (int
data[], size_t
left, size_t
right) { size_t
p = (left + right) / 2; int
pivot = data[p]; size_t
i = left,j = right; for
( ; i < j;) { while
(! (i>= p || pivot < data[i])) ++i; if
(i < p) { data[p] = data[i]; p = i; } while
(! (j <= p || data[j] < pivot)) --j; if
(j > p) { data[p] = data[j]; p = j; } } data[p] = pivot; if
(p - left > 1) quickSort (data, left, p - 1); if
(right - p > 1) quickSort (data, p + 1, right);} int
main(void) { /* 排序与输出 */ quick_sort(a, 0, 13); prt(14); return
0;} |

3. 希尔排序
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
void
shellsort(int
*data, size_t
size){ for
(int gap = size / 2; gap > 0; gap /= 2) for
(int i = gap; i < size; ++i) { int
key = data[i]; int
j = 0; for( j = i -gap; j >= 0 && data[j] > key; j -=gap) { data[j+gap] = data[j]; } data[j+gap] = key; }} |

4. 基数排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 |
#include<stdio.h>#define MAX 20#define SHOWPASS#define BASE 10 void
print(int
*a, int
n) { int
i; for
(i = 0; i < n; i++) { printf("%d\t", a[i]); }} void
radixsort(int
*a, int
n) { int
i, b[MAX], m = a[0], exp
= 1; for
(i = 1; i < n; i++) { if
(a[i] > m) { m = a[i]; } } while
(m / exp
> 0) { int
bucket[BASE] = { 0 }; for
(i = 0; i < n; i++) { bucket[(a[i] / exp) % BASE]++; } for
(i = 1; i < BASE; i++) { bucket[i] += bucket[i - 1]; } for
(i = n - 1; i >= 0; i--) { b[--bucket[(a[i] / exp) % BASE]] = a[i]; } for
(i = 0; i < n; i++) { a[i] = b[i]; } exp
*= BASE; #ifdef SHOWPASS printf("\nPASS : "); print(a, n);#endif }} int
main() { int
arr[MAX]; int
i, n; printf("Enter total elements (n <= %d) : ", MAX); scanf("%d", &n); n = n < MAX ? n : MAX; printf("Enter %d Elements : ", n); for
(i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("\nARRAY : "); print(&arr[0], n); radixsort(&arr[0], n); printf("\nSORTED : "); print(&arr[0], n); printf("\n"); return
0;} |
5. 堆排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 |
#include <iostream>using
namespace std;/* #堆排序#% #数组实现#%*///#筛选算法#%void
sift(int
d[], int
ind, int
len){ //#置i为要筛选的节点#% int
i = ind; //#c中保存i节点的左孩子#% int
c = i * 2 + 1; //#+1的目的就是为了解决节点从0开始而他的左孩子一直为0的问题#% while(c < len)//#未筛选到叶子节点#% { //#如果要筛选的节点既有左孩子又有右孩子并且左孩子值小于右孩子#% //#从二者中选出较大的并记录#% if(c + 1 < len && d[c] < d[c + 1]) c++; //#如果要筛选的节点中的值大于左右孩子的较大者则退出#% if(d[i] > d[c]) break; else { //#交换#% int
t = d[c]; d[c] = d[i]; d[i] = t; // //#重置要筛选的节点和要筛选的左孩子#% i = c; c = 2 * i + 1; } } return;} void
heap_sort(int
d[], int
n){ //#初始化建堆, i从最后一个非叶子节点开始#% for(int
i = (n - 2) / 2; i >= 0; i--) sift(d, i, n); for(int
j = 0; j < n; j++) { //#交换#% int
t = d[0]; d[0] = d[n - j - 1]; d[n - j - 1] = t; //#筛选编号为0 #% sift(d, 0, n - j - 1); }} int
main(){ int
a[] = {3, 5, 3, 6, 4, 7, 5, 7, 4}; //#QQ#% heap_sort(a, sizeof(a) / sizeof(*a)); for(int
i = 0; i < sizeof(a) / sizeof(*a); i++) { cout << a[i] << ‘ ‘; } cout << endl; return
0;} |

原文:http://www.cnblogs.com/zhouzhuo/p/3632514.html