Sorts.h
#ifndef __SORTS_H__ #define __SORTS_H__ //数据交换 void Swap(int& a, int& b); //冒泡排序 void BubbleSort(int a[], int n); //快速排序 void QuickSort(int a[], int n); void QuickSortPartition1(int a[], int beg, int end); void QuickSortPartition2(int a[], int beg, int end); //插入排序 void InsertSort(int a[], int n); //shell排序 void ShellSort(int a[], int n); //归并排序 void MergeSort(int a[], int n); void MergeSortStep(int a[], int beg, int end, int temp[]); void MergeArray(int a[], int beg, int middle, int end, int temp[]); //基数排序 void RadixSort(int a[], int n); int PreRadixSort(int a[], int n, int weight, int bits[]); void RadixSortStep(int a[], int n, int bits[], int temp[]); //堆排序 enum HeapType { HeapType_SMALL = 0, HeapType_BIG = 1 }; typedef int HeapElement; typedef struct _tagHeap { HeapType type; int cursize; int maxsize; HeapElement a[]; } Heap; void HeapSort(HeapElement a[], int n); Heap* CreatHeap(HeapType type, int n); void InsertEle2Heap(Heap* heap, HeapElement ele); void DeleteHeapTop(Heap* heap); void PopHeap(Heap* heap); void KeepBalanceForInsert(Heap* heap, int index); void KeepBalanceForDelete(Heap* heap, int index); #endif
#include "Sorts.h" #include <stdio.h> #include <malloc.h> #include <string.h> //数据交换 void Swap(int& a, int& b) { if (a != b) { a ^= b; b ^= a; a ^= b; } } //冒泡排序 void BubbleSort(int a[], int n) { for (int i = 0; i < n; i++) { int k = 0; for (int j = 0; j < n - i - 1; j++) { if (a[j] > a[j + 1]) { Swap(a[j], a[j + 1]); k = 0; } else { k++; } } i += k; } } //快速排序 void QuickSort(int a[], int n) { QuickSortPartition2(a, 0, n - 1); } void QuickSortPartition1(int a[], int beg, int end) { if (beg < end) { int i = beg - 1; int j = beg; int x = a[end]; for (; j < end; j++) { if (a[j] < x) { i += 1; if (i != j) { Swap(a[i], a[j]); } } } Swap(a[++i], a[end]); QuickSortPartition1(a, beg, i - 1); QuickSortPartition1(a, i + 1, end); } } void QuickSortPartition2(int a[], int beg, int end) { if (beg < end) { int x = a[beg]; int i = beg; int j = end; while (i < j) { while (i < j) { if (a[j] <= x) { a[i++] = a[j]; break; } j--; } while (i < j) { if (a[i] > x) { a[j--] = a[i]; break; } i++; } } a[i] = x; QuickSortPartition2(a, beg, i - 1); QuickSortPartition2(a, i + 1, end); } } //插入排序 void InsertSort(int a[], int n) { for (int i = 1; i < n; i++) { int x = a[i]; int j = i - 1; for (; j >= 0; j--) { if (a[j] > x) { a[j + 1] = a[j]; } else break; } a[j + 1] = x; } } //shell排序 void ShellSort(int a[], int n) { for (int g = n / 2; g >= 1; g /= 2) { for (int i = 0; i < g; i++) { for (int j = i + g; j < n; j += g) { int x = a[j]; int k = j - g; for (; k >= 0; k -= g) { if (a[k] > x) { a[k + g] = a[k]; } else { break; } } a[k + g] = x; } } } } //归并排序 void MergeSort(int a[], int n) { int *pTemp = new int[n]; if (!pTemp) return; MergeSortStep(a, 0, n - 1, pTemp); delete(pTemp); } void MergeSortStep(int a[], int beg, int end, int temp[]) { if (beg < end) { int middle = (beg + end) / 2; MergeSortStep(a, beg, middle, temp); MergeSortStep(a, middle + 1, end, temp); MergeArray(a, beg, middle, end, temp); } } void MergeArray(int a[], int beg, int middle, int end, int temp[]) { int i = beg; int j = middle + 1; int k = 0; while (i <= middle && j <= end) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= middle) temp[k++] = a[i++]; while (j <= end) temp[k++] = a[j++]; for (int i = 0; i < k; i++) a[beg + i] = temp[i]; } //基数排序 void RadixSort(int a[], int n) { int* pBits = new int[1]; if (!pBits) return; int* pTemp = new int[n]; if (!pTemp) { delete pBits; return; } int weight = 1; while (1) { int count = PreRadixSort(a, n, weight, pBits); if (0 == count) { delete pBits; delete pTemp; return; } RadixSortStep(a, n, pBits, pTemp); weight++; } } int PreRadixSort(int a[], int n, int weight, int bits[]) { int value = 1; for (int i = 0; i < weight; i++) value *= 10; int ret = 0; for (int i = 0; i < n; i++) { if (a[i] / (value / 10) != 0 && !ret) ret = 1; bits[i] = a[i] % value / (value / 10); } return ret; } void RadixSortStep(int a[], int n, int bits[], int temp[]) { int k = 0; for (int i = -9; i < 10; i++) { for (int j = 0; j < n; j++) { if (bits[j] == i) temp[k++] = a[j]; } } for (int i = 0; i < n; i++) a[i] = temp[i]; } //堆排序 void HeapSort(HeapElement a[], int n) { Heap *heap = CreatHeap(HeapType_SMALL, 1); if (heap == NULL) { return; } for (int i = 0; i < n; i++) { InsertEle2Heap(heap, a[i]); } //for (int i = 0; i < heap->cursize; i++) // printf("%d ", heap->a[i]); //printf("\n"); PopHeap(heap); free(heap); } Heap* CreatHeap(HeapType type, int n) { Heap *heap = (Heap*)malloc(sizeof(Heap)+ n * sizeof(HeapElement)); if (!heap) return NULL; heap->type = type; heap->cursize = 0; heap->maxsize = n; memset(heap->a, 0, n * sizeof(HeapElement)); return heap; } void InsertEle2Heap(Heap* heap, HeapElement ele) { if (!heap) return; if (heap->cursize == heap->maxsize) { heap = (Heap*)realloc(heap, sizeof(Heap)+ heap->maxsize * 2 * sizeof(HeapElement)); heap->maxsize = heap->maxsize * 2; } heap->a[heap->cursize++] = ele; KeepBalanceForInsert(heap, heap->cursize - 1); } void DeleteHeapTop(Heap* heap) { if (heap->cursize > 0) { heap->a[0] = heap->a[heap->cursize - 1]; heap->cursize--; KeepBalanceForDelete(heap, 0); } } void PopHeap(Heap* heap) { while (heap->cursize > 0) { printf("%d ", heap->a[0]); DeleteHeapTop(heap); } printf("\n"); } void KeepBalanceForInsert(Heap* heap, int index) { if (!heap) return; int parentIndex = (index - 1) / 2; if (parentIndex >= 0) { if (HeapType_SMALL == heap->type) { if (heap->a[index] < heap->a[parentIndex]) { Swap(heap->a[index], heap->a[parentIndex]); KeepBalanceForInsert(heap, parentIndex); } } else { if (heap->a[index] > heap->a[parentIndex]) { Swap(heap->a[index], heap->a[parentIndex]); KeepBalanceForInsert(heap, parentIndex); } } } } void KeepBalanceForDelete(Heap* heap, int index) { int lindex = index * 2 + 1; int rindex = index * 2 + 2; if (lindex > heap->cursize - 1) return; if (rindex > heap->cursize - 1) { if (heap->type == HeapType_SMALL && heap->a[index] > heap->a[lindex]) Swap(heap->a[index], heap->a[lindex]); else if (heap->type == HeapType_BIG && heap->a[index] < heap->a[lindex]) Swap(heap->a[index], heap->a[lindex]); return; } else { if (heap->type == HeapType_SMALL) { int exchangeIndex = lindex; if (heap->a[rindex] < heap->a[lindex]) { exchangeIndex = rindex; } if (heap->a[index] > heap->a[exchangeIndex]) { Swap(heap->a[index], heap->a[exchangeIndex]); KeepBalanceForDelete(heap, exchangeIndex); } } else { int exchangeIndex = lindex; if (heap->a[rindex] > heap->a[lindex]) { exchangeIndex = rindex; } if (heap->a[index] < heap->a[exchangeIndex]) { Swap(heap->a[index], heap->a[exchangeIndex]); KeepBalanceForDelete(heap, exchangeIndex); } } } }