几个简单的排序

本文详细介绍了排序算法(冒泡排序、直接插入排序、选择排序、快速排序)及数据结构(数组、链表、栈、队列)的实现原理与代码示例,帮助开发者深入理解算法与数据结构的基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 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);

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值