voidselectSort(int array[], int n){ for (int i = 0; i < n - 1; i++) { int min = i; for (int j = i + 1; j < n; j++) { if (array[j] < array[min]) min = j; } if (i != min) { int temp = array[i]; array[i] = array[min]; array[min] = temp; } } }
voidswap(int* a, int* b){ int temp = *b; *b = *a; *a = temp; }
voidmax_heapify(int array[], int start, int end){ //建立父节点指标和子结点指标 int dad = start; int son = dad * 2 + 1; while (son <= end){//若子结点索引在范围内才做比较 //先比较两个子结点大小,选择最大的 if (son + 1 <= end && array[son] < array[son + 1]) son++; if (array[dad] > array[son]) //如果父节点大於子结点代表调整完毕,直接跳出函数 return; else{ swap(&array[dad], &array[son]); dad = son; son = dad * 2 + 1; } } }
voidheap_sort(int array[], int len){ int i; //初始化,生成最大堆 for (i = len / 2 - 1; i >= 0; i--) max_heapify(array, i, len - 1);
//堆顶元素与末尾元素进行交换,再重新调整,直到排序完毕 for (i = len - 1; i > 0; i--){ swap(&array[0], &array[i]); max_heapify(array, 0, i - 1); } }
voidmerge(int array[], int low, int mid, int high, int temp[]){ int i = low, j = mid + 1; int m = mid, n = high; int k = 0; while (i <= m && j <= n){ if (array[i] <= array[j]) temp[k++] = array[i++]; else temp[k++] = array[j++]; } while (i <= m) temp[k++] = array[i++];
while (j <= n) temp[k++] = array[j++];
for (i = 0; i < k; i++) array[low + i] = temp[i]; } voidmergesort(int array[], int low, int high, int temp[]){ if (low < high){ int mid = (low + high) / 2; mergesort(array, low, mid, temp); mergesort(array, mid + 1, high, temp); merge(array, low, mid, high, temp); } }