voidSort::ShellSort(T* array,int len1, T* delta, int len2) { //按一定增量来划分序列 for (int i = 0; i < len2; ++i) { T tmp = 0; T dk = delta[i]; //在相应序列内进行插入排序 for (int j = dk; j < len1; ++j) { if (array[j] < array[j - dk]) { tmp = array[j]; int k; for ( k = j - dk; k >= 0 && tmp < array[k]; k -= dk) { array[k+dk] = array[k]; ; } array[k+dk] = tmp; } } } }
交换排序
冒泡排序
1 2 3 4 5 6 7 8 9 10 11
voidSort::BubbleSort(T *array, int len) { for (int i = 0; i < len - 1; ++i) { for (int j = 0; j < len - i - 1; ++j) { if (array[j] > array[j + 1]) Swap(&array[j],&array[j+1]); } } }
intSort::SelectMinKey(T* array, int pos, int len) { T minkey = MAX_VALUE; int j = 0; for (int i = pos; i < len; ++i) { if (array[i] < minkey) { minkey = array[i]; j = i; } } return j; }
voidSort::SelectSort(T* array, int len) { for (int i = 0; i < len - 1; ++i) { int j = SelectMinKey(array, i , len); if (j != i) { Swap(&array[j], &array[i]); } } }
template<typename T> void Sort<T>::siftdown(arr &heap, int n, int p) { int i = p; int j = 2 * i + 1; while (j < n) { if (j < n - 1 && heap[j] > heap[j + 1]) j++; if (heap[i] <= heap[j]) break; else { swap(heap[i], heap[j]); i = j; j = 2 * i + 1; } }
} template<typename T> int Sort<T>::RemoveMinKey(arr& heap, int n) { int key = heap[0]; heap[0] = heap[n]; siftdown(heap, n, 0); return key; }
template<typename T> void Sort<T>::HeapSort(arr& nums, int n) { int heap[MAXSIZE]; for (int i = 0; i < n; ++i) { heap[i] = nums[i]; } int spos = n / 2 - 1; //建立最小堆结构 //判断是否有左右子树,有则与其比较,选出最小值,作为父节点 while (spos--) { siftdown(heap, n, spos); } //删除堆顶元素后更新 for (int i = 0; i < n; ++i) { nums[i] = RemoveMinKey(heap, n-i-1); }