选择排序
工作原理:每一次从待排序的数据元素中选出最大或最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
void SelectSort(int* a, size_t size) { assert(a); for (int i = 0; i < size; i++) { int min = i; for (int j = i + 1; j < size; j++) { //选择最小元素 if (a[j] < a[i]) { min = j; } } //放在第i个位置 if (a[i] != a[min]) { int tmp = a[i]; a[i] = a[min]; a[min] = tmp; } } }
堆排序
只需要
//升序 void AdjustDown(int* a, size_t size, int root) { assert(a); int child = root * 2 + 1; while (child < size) { if (child + 1 < size && a[child + 1] > a[child]) { child++; } if (a[child] > a[root]) { swap(a[child], a[root]); root = child; child = root * 2 + 1; } else { break; } } } void AdjustUp(int* a, size_t size, int root) { assert(a); int child = root * 2 + 1; while (child < size) { if (child + 1 < size && a[child + 1] < a[child]) { child++; } if (a[child] < a[root]) { swap(a[child], a[root]); root = child; child = root * 2 + 1; } else { break; } } } void Heap_Sort(int* a, size_t size) { assert(a); //建堆 for (int i = (size - 2) / 2; i >= 0; i--) { AdjustDown(a, size, i); } for (int j = size - 1; j > 0; j--) { swap(a[0], a[j]); AdjustDown(a, j, 0); } } void _Heap_Sort(int* a, size_t size) { assert(a); for (int i = (size - 2) / 2; i >= 0; i--) { AdjustUp(a, size, i); } for (int j = size - 1; j > 0; j--) { swap(a[0], a[j]); AdjustUp(a, j, 0); } }
本文出自 “写的质量还是低” 博客,谢绝转载!
原文地址:http://10324228.blog.51cto.com/10314228/1784973