首页 > 代码库 > 各种排序集合
各种排序集合
冒泡排序
/* * CreateTime: 2014-09-15 20:10:48 * 因为冒泡是相邻交换, sign 标记着这次不用交换, 下次也不用交换. */ #include <cstdio> #define N 10 int main(void) { int sign = 1; int a[10] = { 1, 454, 634,34, 3, 3, 2343, 23435, 34, 42 }; /* 第一轮排序后, 最大的已经在 a[9] 上 */ for(int i = 0; i < N-1 && sign; ++i) { sign = 0; for(int j = 0; j < N-1-i; ++j) { if(a[j] > a[j+1]) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; sign = 1; } } } for(int i = 0; i < 10; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; }
选择排序
/* * CreateTime: 2014-09-15 20:15:44 */ #include <cstdio> int main(void) { int a[10] = {1, 454, 634,34, 3, 3, 2343, 23435, 34, 42}; for(int i = 0; i < 10-1; ++i) { int k = i; for(int j = i+1; j < 10; ++j) { if(a[j] < a[k]) { // 选择出最小的 k = j; } } if(k != i) { int temp = a[k]; a[k] = a[i]; a[i] = temp; } } for(int i = 0; i < 10; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; }
插入排序
/* * CreateTime: 2014-09-15 20:11:59 */ #include <cstdio> int main(void) { int a[10] = { 1, 454, 634, 34, 4, 3, 2343, 23435, 84, 42 }; for(int i = 1; i < 10; i++) { int key = a[i]; int j = i - 1; while(j >= 0 && a[j] > key) { a[j+1] = a[j]; j--; } a[j+1] = key; } // | | | | | | | | | | 相当于有十张牌, 一直往前面插 for(int i = 0; i < 10; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; }
希尔排序
/* * Created Time: 2014-05-24 18:53:01 */ #include <cstdio> void shellsort(void); int a[10] = { 1, 454, 634,34, 3, 3, 2343, 23435, 34, 42 }; int main(void) { shellsort(); for(int i = 0; i < 10; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; } void shellsort(void) { for(int k = N / 2; k > 0; k = k / 2) { for(int i = k; i < N; i++) { for(int j = i; j > k && a[i] < a[j-k]; j = j - k) { int tmp = a[j]; a[j] = a[j-k]; a[j-k] = tmp; } } } }
归并排序
/* * CreateTime: 2014-09-14 09:49:11 */ #include <cstdio> void msort(int start, int end); void merge(int start1, int end1, int end2); int a[10] = {1, 34, 45, 3, 54, 384, 454, 4387, 4546, 10}; int temp[10]; int main(void) { msort(0, 9); for(int i = 0; i < 10; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; } void msort(int start, int end) { if(start < end) { int centre = (start + end) / 2; msort(start, centre); msort(centre+1, end); merge(start, centre, end); } } void merge(int start1, int end1, int end2) { int start2 = end1 + 1; int length = start1; int num = end2 - start1 + 1; while(end1 >= start1 && end2 >= start2) { if(a[start1] <= a[start2]) { temp[length++] = a[start1++]; } else { temp[length++] = a[start2++]; } } /* 剩下的一组 */ while(start1 <= end1) { temp[length++] = a[start1++]; } while(start2 <= end2) { temp[length++] = a[start2++]; } /* 剩下的一组 */ for(int i = 0; i < num; i++, end2--) { a[end2] = temp[end2]; } }
/* * CreateTime: 2014-09-14 09:49:11 */ #include <cstdio> void msort(int l, int r); void merge(int l, int mid, int r); int a[10] = {1, 34, 45, 3, 54, 384, 454, 4387, 4546, 10}; int temp[10]; int main(void) { msort(0, 9); for(int i = 0; i < 10; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; } void msort(int l, int r) { if(l < r) { int mid = (l + r) / 2; msort(r, mid); msort(mid+1, r); merge(l, mid, r); } } void merge(int l, int mid, int r) { int i = l; int j = mid + 1; for(int t = l; t <= r; t++) { temp[t] = a[t]; } for(int t = l; t <= r; t++) { if(i > mid) { // l is full a[t] = temp[j++]; } else if(j > r) { // r is full a[t] = temp[i++]; } else if(temp[i] < temp[j]) { a[t] = temp[i++]; } else if(temp[i] >= temp[j]){ a[t] = temp[j++]; } } }
堆排序
/* * CreateTime: 2014-10-27 19:02:02 */ #include <cstdio> #include <cassert> int arr[100] = { 10, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1 }; // a[0] 表示堆大小 int left(int i); int right(int i); void max_heapify(int i); void build_max_heap(void); void insert_element(int value); void heap_sort(void); void print() { for(int i = 1; i <= arr[0]; i++) { printf("%4d", arr[i]); } printf("\n"); } int main(void) { build_max_heap(); print(); insert_element(100); print(); heap_sort(); return 0; } int left(int i) { return (i*2); } int right(int i) { return (i*2 + 1); } void max_heapify(int i) { int largest; int l = left(i); int r = right(i); if(l <= arr[0] && arr[l] > arr[i]) { largest = l; } else { largest = i; } if(r <= arr[0] && arr[r] > arr[largest]) { largest = r; } if(largest != i) { int tmp = arr[i]; arr[i] = arr[largest]; arr[largest] = tmp; max_heapify(largest); } } void build_max_heap(void) { for(int i = arr[0]/2; i > 1; i--) { max_heapify(i); } } void insert_element(int value) { arr[0]++; int t = arr[0]; arr[t] = value; while(t > 1 && arr[t] > arr[t/2]) { // 重置, 因为最后一个可能大于父节点 int tmp = arr[t]; arr[t] = arr[t/2]; arr[t/2] = tmp; t = t/2; } } void heap_sort(void) { build_max_heap(); // 建堆 for(int i = arr[0]; i >= 1; i--) { int last_element = arr[0]; // 通过交换第一个(最大值) 和最后一个然后重建堆來完成 int tmp = arr[last_element]; arr[last_element] = arr[1]; arr[1] = tmp; arr[0]--; // 删除最后一个 printf("%4d", arr[last_element]); // 依次输出被删除的(也就是每次的最大來达到排序) max_heapify(1); // 重建 } printf("\n"); }
快速排序
/* * CreateTime: 2014-11-01 22:57:54 */ #include <cstdio> #include <cstdlib> #include <cstring> int a[10]; void print(void); void swap(int &x, int &y); void qsort(int l, int r); int partition(int l, int r); int main(void) { qsort(0, 9); print(); return 0; } void print(void) { for(int i = 0; i < 10; i++) { printf("%3d", a[i]); } printf("\n"); } void qsort(int l, int r) { if(l < r) { int q = partition(l, r); qsort(l, q-1); qsort(q+1, r); } } int partition(int l, int r) { int q = l - 1; int x = a[r]; for(int i = l; i < r; i++) { if(a[i] < x) { q++; swap(a[i], a[q]); } } swap(a[q+1], a[r]); return q+1; }
各种排序集合
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。