数据结构入门7

讲了一个快速排序, 利用分治思想, 看完感觉和归并有点像. 接下来准备看看算法还有不少书. 感觉数据结构和算法就能看很久了...

#include <stdio.h>

void QuickSort(int* a, int low, int high);
int FindPos(int* a, int low, int high);

int main(void)
{
    int i = 0;
    int a[6] = {2, 1, 0 ,5, 4, 3};

    // 快速排序参数: 数组a, 第一个下标0, 最后一个下标5
    QuickSort(a, 0, 5);

    for(i=0;i<6; i++)
    {
        printf("%i ", a[i]);
    }

    printf("\n");

    return 0;
}

void QuickSort(int* a, int low, int high)
{
    int pos;

    // 终止条件
    // 当low == high时, 数组为空时结束
    if(low < high)
    {
        // a是选择数组a[0]第一个元素作为基准元素
        // a[pos]作为基准值, 将a数组分为三部分: a[low]-[pos-1],a[pos],a[pos+1]-a[high]
        pos = FindPos(a, low, high);
        QuickSort(a, low, pos-1);
        QuickSort(a, pos+1, high);

        /*
            通过分区函数FindPos将数组分为两部分
            递归排序左右两个子数组
        */
    }
}

// 找到值并移动
int FindPos(int* a, int low, int high)
{
    // 固定选择数组第一个元素作为基准值
    int val = a[low];

    // 起始条件 当low比high小就循环
    // 即左右指针未相遇
    // 当 low == high 找到基准元素的最终位置, 退出循环
    while (low < high)
    {
        // 左右指针不相遇 当指针相遇或交叉结束 防止数组越界
        // 当前元素小于基准值
        while (low < high && a[high] >= val)
            --high; // 左移一位
        a[low] = a[high]; // 该元素赋给 low指针位置, high指针位置为 "空"

        //当前元素大于基准值
        while (low<high && a[low] <= val)
            ++low;
        a[high] = a[low];

        a[low] = val; // 将基准值放回原来位置

        return high; // 当条件终止时, low和high是指向相同位置, 此时 low == high
    }
}


posted @ 2025-06-14 00:28  鲲特牌  阅读(6)  评论(0)    收藏  举报