boxmoe_header_banner_img

欢迎来到小张の小站!

加载中

文章导读

排序


avatar
小张 2025年6月11日 86

快速排序

list = [1, 6, 9, 2, 5, 0, 7, 3]
def quickSort(list, low, high):
    if (low < high):
        pivot = huafen(list, low, high) # 取基准
        quickSort(list, low, pivot - 1) #左子区
        quickSort(list, pivot + 1, high) #右子区
def huafen(list, low, high):
    pivot = list[low] #定基准
    # 判断是否有小于pivot的值,没有则往左以此检查
    while(low < high and list[high] > pivot):
        high -= 1
    list[low] = list[high]
    # 判断是否有大于pivot的值,没有则往右以此检查
    while(low < high and list[low] <= pivot):
        low += 1
    list[high] = list[low]
    # 放回pivot (因为最后low=high,所以这里写low或者是high都相同)
    list[low] = pivot
    # 返回基准索引
    return low
if __name__ == "__main__":
    print('排序前:', list)
    quickSort(list, 0, len(list) - 1)
    print('排序后:', list)

排序前: [1, 6, 9, 2, 5, 0, 7, 3]
排序后: [0, 1, 2, 3, 5, 6, 7, 9]
#include <stdio.h>
// 划分函数(类似于 Python 的 huafen)
int partition(int arr[], int low, int high) {
    int pivot = arr[low];   // 选择第一个元素作为基准
    while (low < high) {
        // 从右往左找比 pivot 小的元素
        while (low < high && arr[high] > pivot) {
            high--;
        }
        arr[low] = arr[high];  // 把小的值移到左侧
        // 从左往右找比 pivot 大的元素
        while (low < high && arr[low] <= pivot) {
            low++;
        }
        arr[high] = arr[low];  // 把大的值移到右侧
    }

    // 放回 pivot
    arr[low] = pivot;
    return low;  // 返回基准索引
}

// 快速排序递归实现
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);  // 划分
        quickSort(arr, low, pivot - 1);  // 递归排序左侧
        quickSort(arr, pivot + 1, high); // 递归排序右侧
    }
}
// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}
// 主函数
int main() {
    int arr[] = {1, 6, 9, 2, 5, 0, 7, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    printf("排序前:");
    printArray(arr, size);

    quickSort(arr, 0, size - 1);

    printf("排序后:");
    printArray(arr, size);
    return 0;
}

堆排序

// 建立大根堆
void BuildMaxHeap(int A[], int len){
    for(int i = len / 2;i > 0;i--)  // 从后往前调整所有非终端结点
        HeadAdjust(A, i, len);
}

// 将以K为根的字树调整为大根堆
void HeadAdjust(int A[],int k,int len){
    A[0] = A[k];                        // A[0]暂存子树的根节点
    for(int i = 2 * k;i <= len;i*=2){   // 沿key较大的子结点向下筛选
        if(i < len && A[i] < A[i+1])
            i++;                        // 取key较大的子结点下标
        if(A[0] >= A[i])    break;      // 筛选结果
        else{
            A[k] = A[i];                // 将A[i]调整到双亲结点上
            k = i;                      // 修改k值,以便继续向下筛选
        }
    }
    A[k] = A[0];                        // 被筛选结点的值放入最终位置
}

// 堆排序的完整逻辑
void HeapSort(int A[], int len){
    BuildMaxHeap(int A[], int len);
    for (int i=len;i>1;i--){
        swap(A[i], A[1]);
        HeadAdjust(A,1,i-1);
    }
}

归并排序


int *B = (int *)malloc(n*sizeof(int));  //辅助数组B
// A[low~mid]和A[mid+1~high]各自有序,将两部分进行合并
void Merge(int A[], int low, int mid, int high){
    int i, j, k;
    // 将A中所有元素复制到B中
    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
感谢您的支持
微信赞赏

微信扫一扫

支付宝赞赏

支付宝扫一扫



评论(4)

查看评论列表
评论头像
zwl 博主 2025年06月11日
棒棒的!!!ヾ(≧∇≦*)ゝ
评论头像
轨迹 2025年06月24日
🎉
评论头像
zwl 博主 2025年06月24日

此评论仅作者可见

评论头像
zwl 博主 2025年07月08日
Crazy!!!(⌒▽⌒)

发表评论

表情 颜文字
插入代码