本文共 4316 字,大约阅读时间需要 14 分钟。
每一趟在后面n-i+1(i=1, 2, ..., n-1) 个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟只剩下一个待排序元素,结束选择
。// 简单选择排序void SelectSort(int a[], int n){ int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < n; j++) { if (a[j] < a[min])min = j; } if (min != i) { int t = a[i]; a[i] = a[min]; a[min] = t; } }}
L(i)>=L(2i) and L(i)>=L(2i+1)
② L(i)<=L(2i) and L(i)<=(2i+1)
大堆根
,显而易见,此时根节点的关键字要比其子树的关键字都大
;满足条件②的称为小堆根
,此时与大堆根相反,根节点的关键字小于其子树的关键字。 先将待排序表建成初始堆,例如构成大堆根,此时堆顶元素就是最大值,可直接输出;输出堆顶元素后,将堆底元素送入堆顶,由于此时不满足大堆根性质,需要将堆顶元素向下调整使之恢复满足大堆根性质,在输出堆顶元素
反复如此,直到堆中只剩下一个元素。筛选法
来进行调整,而构建初始堆则是反复使用筛选法进行构造。//小堆跟// 堆排序:①调整void MinHeapAdjust(int a[], int k, int len){ a[0] = a[k]; int i; for (i = 2 * k; i <= len; i *= 2) { if (i < len&& a[i] < a[i + 1]) i++; if (a[0] >= a[i])break; else { a[k] = a[i]; k = i; } } a[k] = a[0];}//堆排序:②构建初始堆void CreateMinHeap(int a[], int len){ for (int i = len / 2; i > 0; i--) MinHeapAdjust(a, i, len);}//堆排序:③排序void MinHeapSort(int a[], int len){ CreateMinHeap(a, len); for (int i = len; i > 1; i--) { int t = a[i]; a[i] = a[1]; a[1] = t; MinHeapAdjust(a, 1, i - 1); }}// 大堆根// 调整void MaxHeapAdjust(int a[], int k, int len){ a[0] = a[k]; int i; for (i = 2 * k; i <= len; i *= 2) { if (i < len && a[i] > a[i + 1]) i++; if (a[0] <= a[i])break; else { a[k] = a[i]; k = i; } } a[k] = a[0];}// 构造初始堆void CreateMaxHeap(int a[], int len){ for (int i = len / 2; i > 0; i--) MaxHeapAdjust(a, i, len);}// 大堆根排序void MaxHeapSort(int a[], int len){ CreateMaxHeap(a, len); for (int i = len; i > 1; i--) { int t = a[i]; a[i] = a[1]; a[1] = t; MaxHeapAdjust(a, 1, i - 1); }}
将待排序表的 n 个元素,视作 n 个有序的子表,然后两两归并,得到 (n/2) 或 (n/2)+1 个长度为 1 或 2 的有序表;然后继续两两归并……直到合并成一个长度为 n 的有序表为止
。由于每次都是两两合并,因此又称为二路归并排序
。// 二路归并排序int* b = new int[20];void Merge(int a[], int low, int mid, int high){ int i, j, k; for (k = low; k <= high; k++) b[k] = a[k]; for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) { if (b[i] <= b[j]) a[k] = b[i++]; else a[k] = b[j++]; } while (i <= mid) a[k++] = b[i++]; while (j <= high)a[k++] = b[j++];}void MergeSort(int a[], int low, int high){ if (low < high) { int mid = (low + high) / 2; MergeSort(a, low, mid); MergeSort(a, mid + 1, high); Merge(a, low, mid, high); }}
基于关键字各位的大小进行排序,是一种借助多关键字排序的思想堆单逻辑关键字进行排序的方法
。 最高位优先法(MSD)和最低位优先法(LSD)
,前者按照关键字位权重递减依次逐层划分成若干跟小子序列,最后将所有序列依次连接成一个有序序列;后者按照关键字递增依次进行排序,同样最后形成一个有序序列。 #define MAXNUM_KEY 8#define RADIX 10#define MAX_SPACE 1000typedef struct{ int keys[MAXNUM_KEY]; int next;}SLCell;typedef struct{ SLCell r[MAX_SPACE]; int keyNum; int recNum; // 链表当前长度}SLList;typedef int ArrType[RADIX];void Distribute(SLCell &r, int i, ArrType &f, ArrType &e){ for(int j=0;j
转载地址:http://bhqgn.baihongyu.com/