1.直接插入排序
1 #include <iostream> 2 #include <iomanip> 3 //直接插入 4 using namespace std; 5 void swap(int &x, int &y) 6 { 7 int temp = x; 8 x = y; 9 y = temp; 10 } 11 void insertion(int a[], int sz) 12 { 13 for (int i = 1; i < sz; i++) { 14 int j = i; 15 while (j > 0 && (a[j] < a[j - 1])) { 16 swap(a[j], a[j - 1]); 17 j--; 18 } 19 } 20 for (int k = 0; k < sz; k++) 21 cout << setw(3) << a[k]; 22 } 23 24 void main() 25 { 26 int a[] = { 15, 9, 8, 1, 4, 11, 7, 12, 13, 6, 5, 3, 16, 2, 10, 14 }; 27 int size = sizeof(a) / sizeof(int); 28 for (int i = 0; i < size; i++) 29 cout << setw(3) << a[i]; 30 cout << endl; 31 insertion(a, size); 32 33 }
2.折半插入排序
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 5 void HalfInsertSort(int a[] , int size){ 6 int i, j, low, high, mid; 7 for (i = 2; i <size;i++){ 8 a[0] = a[i]; 9 low = 1; 10 high = i - 1; 11 while (low <= high){ 12 mid = (low + high) / 2; 13 if (a[mid] > a[0]) 14 high = mid - 1; 15 else 16 low = mid + 1; 17 } 18 for (j = i - 1; j >= high + 1;--j){ 19 a[j + 1] = a[j]; 20 } 21 a[high + 1] = a[0]; 22 } 23 cout << endl; 24 } 25 void main() { 26 int a[] = { 0, 5, 2, 4, 3, 1 }; 27 int size = sizeof(a) / sizeof(int); 28 for (int i = 0; i < size; i++){ 29 cout << setw(3) << a[i]; 30 } 31 cout << endl; 32 HalfInsertSort(a, size); 33 for (int i = 0; i < size; i++){ 34 cout << setw(3) << a[i]; 35 } 36 }
3.希尔排序
1 #include "iostream" 2 #include "iomanip" 3 using namespace std; 4 void ShellInsertSort(int a[], int n) 5 { 6 int i, j, gap; 7 8 for (gap = n / 2; gap > 0; gap /= 2) //步长 9 for (i = 0; i < gap; i++) //直接插入排序 10 { 11 for (j = i + gap; j < n; j += gap) 12 if (a[j] < a[j - gap]) 13 { 14 int temp = a[j]; 15 int k = j - gap; 16 while (k >= 0 && a[k] > temp) 17 { 18 a[k + gap] = a[k]; 19 k -= gap; 20 } 21 a[k + gap] = temp; 22 } 23 } 24 } 25 void main(){ 26 int a[] = { 0, 5, 2, 4, 3, 1, 7, 9 }; 27 int size = sizeof(a) / sizeof(int); 28 for (int i = 0; i < size; i++){ 29 cout << setw(3) << a[i]; 30 } 31 cout << endl; 32 ShellInsertSort(a, size); 33 for (int i = 0; i < size; i++){ 34 cout << setw(3) << a[i]; 35 } 36 }
4.冒泡排序
1 #include <stdio.h> 2 void swap(int &a, int &b) 3 { 4 int temp = a; 5 a = b; 6 b = temp; 7 } 8 void main() 9 { 10 int arr[] = { 15, 225, 34, 42 }; 11 int size = sizeof(arr)/sizeof(int); 12 int i, j; 13 for (i = 0; i < size; ++i) 14 { 15 for (j = 0; j < size - i-1;j++){ 16 if (arr[j]>arr[j + 1]) 17 swap(arr[j], arr[j + 1]); 18 } 19 } 20 for (i = 0; i <size; ++i) 21 { 22 printf("%4d", arr[i]); 23 } 24 }
5.快速排序
1 #include <stdio.h> 2 //快速排序 3 void quick_sort(int s[], int l, int r) 4 { 5 if (l < r) 6 { 7 int i = l, j = r, x = s[l]; 8 while (i < j) 9 { 10 while (i < j && s[j] >= x) 11 j--; 12 if (i < j) 13 s[i++] = s[j]; 14 15 while (i < j && s[i] < x) 16 i++; 17 if (i < j) 18 s[j--] = s[i]; 19 } 20 s[i] = x; 21 quick_sort(s, l, i - 1); 22 quick_sort(s, i + 1, r); 23 } 24 } 25 void main() 26 { 27 int arr[] = { 15, 225, 34, 42 ,8}; 28 int size = sizeof(arr)/sizeof(int); 29 quick_sort(arr, 0, size - 1); 30 for (int i = 0; i < size; i++){ 31 printf("%6d",arr[i]); 32 } 33 }
6.选择排序
1 #include <stdio.h> 2 //选择排序 3 void SelectSort(int arr[],int size){ 4 for (int i = 0; i < size; i++){ 5 for (int j = i + 1; j < size;j++){ 6 if (arr[i] > arr[j]){ 7 int temp = arr[i]; 8 arr[i] = arr[j]; 9 arr[j] = temp; 10 } 11 } 12 } 13 } 14 15 void main() 16 { 17 int arr[] = { 15, 225, 34, 42 ,8}; 18 int size = sizeof(arr)/sizeof(int); 19 int l = 0; 20 SelectSort(arr,size); 21 for (int i = 0; i < size; i++){ 22 printf("%6d",arr[i]); 23 } 24 }
7.归并排序
1 /** 2 * 归并排序:C 语言 3 * 4 * @author skywang 5 * @date 2014/03/12 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 11 // 数组长度 12 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) ) 13 14 /* 15 * 将一个数组中的两个相邻有序区间合并成一个 16 * 17 * 参数说明: 18 * a -- 包含两个有序区间的数组 19 * start -- 第1个有序区间的起始地址。 20 * mid -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。 21 * end -- 第2个有序区间的结束地址。 22 */ 23 void merge(int a[], int start, int mid, int end) 24 { 25 int *tmp = (int *)malloc((end - start + 1)*sizeof(int)); // tmp是汇总2个有序区的临时区域 26 int i = start; // 第1个有序区的索引 27 int j = mid + 1; // 第2个有序区的索引 28 int k = 0; // 临时区域的索引 29 30 while (i <= mid && j <= end) 31 { 32 if (a[i] <= a[j]) 33 tmp[k++] = a[i++]; 34 else 35 tmp[k++] = a[j++]; 36 } 37 38 while (i <= mid) 39 tmp[k++] = a[i++]; 40 41 while (j <= end) 42 tmp[k++] = a[j++]; 43 44 // 将排序后的元素,全部都整合到数组a中。 45 for (i = 0; i < k; i++) 46 a[start + i] = tmp[i]; 47 48 free(tmp); 49 } 50 51 /* 52 * 归并排序(从上往下) 53 * 54 * 参数说明: 55 * a -- 待排序的数组 56 * start -- 数组的起始地址 57 * endi -- 数组的结束地址 58 */ 59 void merge_sort_up2down(int a[], int start, int end) 60 { 61 if (a == NULL || start >= end) 62 return; 63 64 int mid = (end + start) / 2; 65 merge_sort_up2down(a, start, mid); // 递归排序a[start...mid] 66 merge_sort_up2down(a, mid + 1, end); // 递归排序a[mid+1...end] 67 68 // a[start...mid] 和 a[mid...end]是两个有序空间, 69 // 将它们排序成一个有序空间a[start...end] 70 merge(a, start, mid, end); 71 } 72 73 74 /* 75 * 对数组a做若干次合并:数组a的总长度为len,将它分为若干个长度为gap的子数组; 76 * 将"每2个相邻的子数组" 进行合并排序。 77 * 78 * 参数说明: 79 * a -- 待排序的数组 80 * len -- 数组的长度 81 * gap -- 子数组的长度 82 */ 83 void merge_groups(int a[], int len, int gap) 84 { 85 int i; 86 int twolen = 2 * gap; // 两个相邻的子数组的长度 87 88 // 将"每2个相邻的子数组" 进行合并排序。 89 for (i = 0; i + 2 * gap - 1 < len; i += (2 * gap)) 90 { 91 merge(a, i, i + gap - 1, i + 2 * gap - 1); 92 } 93 94 // 若 i+gap-1 < len-1,则剩余一个子数组没有配对。 95 // 将该子数组合并到已排序的数组中。 96 if (i + gap - 1 < len - 1) 97 { 98 merge(a, i, i + gap - 1, len - 1); 99 } 100 } 101 102 /* 103 * 归并排序(从下往上) 104 * 105 * 参数说明: 106 * a -- 待排序的数组 107 * len -- 数组的长度 108 */ 109 void merge_sort_down2up(int a[], int len) 110 { 111 int n; 112 113 if (a == NULL || len <= 0) 114 return; 115 116 for (n = 1; n < len; n *= 2) 117 merge_groups(a, len, n); 118 } 119 120 void main() 121 { 122 int i; 123 int a[] = { 80, 30, 60, 40, 20, 10, 50, 70 }; 124 int ilen = LENGTH(a); 125 126 printf("before sort:"); 127 for (i = 0; i<ilen; i++) 128 printf("%d ", a[i]); 129 printf(" "); 130 131 merge_sort_up2down(a, 0, ilen - 1); // 归并排序(从上往下) 132 //merge_sort_down2up(a, ilen); // 归并排序(从下往上) 133 134 printf("after sort:"); 135 for (i = 0; i<ilen; i++) 136 printf("%d ", a[i]); 137 printf(" "); 138 }