// h文件
void swap(int *a, int *b); // 交换两个数
void printArr(int *arr, int count); // 遍历数组
void simpleSelectionSort(int *arr, int count); // 简单选择排序
void selectionSort(int *arr, int count);
void bubbleSort(int *arr, int count); // 冒泡排序
void straightInsertionSort(int *arr, int count); // 直接插入排序
void straightInsertionSort2(int *arr, int count);
void straightInsertionSort3(int *arr, int count);
void HeapAdjust(int *arr,int s, int count); //堆调整
void BuildingHeap(int *arr, int count); //堆建立
void HeapSort(int *arr,int count); //堆排序
// m 文件
void swap(int *a, int *b){ // 位异或
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
void printArr(int *arr, int count){
for (int *p = arr; p < arr + count; p++) {
// 直接遍历地址
printf("%d ", *p);
}
printf("\n");
}
void simpleSelectionSort(int *arr, int count){
for (int i = 0; i < count - 1; i++) {
for (int j = i + 1; j < count; j++) {
if (arr[i] > arr[j]) {
swap(&arr[i], &arr[j]);
}
}
}
}
void selectionSort(int *arr, int count){
for (int i = 0; i < count - 1; i++) {
int k = i;
for (int j = i + 1; j < count; j++) {
if (arr[k] > arr[j]) {
k = j;
}
}
if (k != i) {
swap(&arr[k], &arr[i]);
}
}
}
void bubbleSort(int *arr, int count){
for (int i = 0; i < count - 1; i++) {
BOOL flag = 1;
for (int *p = arr; p < arr + count - 1 - i; p++) {
if (*p > *(p + 1)) {
swap(p, p + 1);
flag = 0;
}
}
if (flag) {
break;
}
}
}
void straightInsertionSort(int *arr, int count){
for (int i = 1; i < count; i++) {
int min = arr[i];
int j = i - 1;
while (arr[j] > min && j >= 0) {
// 一定是min 第一次可能会把 arr[i](arr[j + 1])变成arr[j]
arr[j + 1] = arr[j];
j--;
}
if (j != i - 1) {
arr[j + 1] = min;
}
}
}
void straightInsertionSort2(int *arr, int count){
for (int i = 1; i < count; i++) {
int min = arr[i];
int j = 0;
for (j = i - 1; j >= 0; j--) {
if (arr[j] > min) {
arr[j + 1] = arr[j];
} else {
break;
// 不break,不会停.j会变成0,j + 1就是不是min的位置了
}
}
if (j != i - 1) {
arr[j + 1] = min;
}
}
}
void straightInsertionSort3(int *arr, int count){
for (int i = 1; i < count; i++) {
int min = arr[i];
int k = i - 1;
for (int j = i - 1; j >= 0; j--) {
if (arr[j] > min) {
arr[j + 1] = arr[j];
k--;
}
}
if (k != i - 1) {
arr[k + 1] = min;
}
}
}
// 堆排序 从最后一个节点开始构造堆(1.写一个调整节点的函数和
2.写一个构造堆得函数),然后把第一个和最后一个元素换位置.
再调整count - 1个元素的堆的第一个节点(3.写一个排序的函数).
void HeapAdjust(int *arr, int s, int count){
int child = 2 * s + 1;
while (child < count) {
if (child + 1 < count && arr[child] < arr[child + 1]) {
child++;
}
if (arr[s] < arr[child]) {
swap(&arr[s], &arr[child]);
s = child;
child = 2 * s + 1;
} else {
break;
}
}
}
void BuildingHeap(int *arr, int count){
for (int i = count / 2 - 1; i >= 0 ; i--) {
HeapAdjust(arr, i, count);
}
}
void HeapSort(int *arr, int count){
BuildingHeap(arr, count);
for (int i = count - 1; i > 0; i--) {
swap(&arr[0], &arr[i]);
HeapAdjust(arr, 0, i);
}
}