快速排序法

#include <stdio.h>
#include <stdlib.h>

void swap(int *pi, int *pj)//交换数据
{
    int temp = *pi;
    *pi = *pj;
    *pj = temp;
}

void show(int *p,int n)//显示数组状态
{
    printf("
此时状态");
    for (int i = 0; i < n; i++)
    {
        printf("%4d", p[i]);
    }
}

void quick(int *arr, int iLeft, int iRight)
{
    int i = iLeft;//从左边开始循环
    int j = iRight + 1;//从右边开始循环

    if (i < j)//如果左边小于右边
    {
        do
        {
            do
            {
                i++;

            } while (arr[i] <= arr[iLeft] && i < iRight);
            //从左向右找第一个大于arr[iLeft]的数
            
            do
            {
                j--;
            } while (arr[j] >= arr[iLeft] && j>iLeft);
            //从右向左找第一个小于arr[iLeft]的数

            //如果大数的位置小于小数的位置则进行交换
            if (i < j)
            {
                swap(&arr[i], &arr[j]);
            }
            //这一步的目的是把大的数都放在右边
        } while (i < j);//一直循环到i>=j 说明已经已经折中分好了 此时j保存的是小于arr[iLeft]的数所以要和arr[iLeft]交换
        swap(&arr[iLeft], &arr[j]);

        //j是分界点,快速排序 左边的 以及右边的
        quick(arr, iLeft, j - 1);
        quick(arr, j + 1, iRight);
    }
}

void main()
{
    int num[10] = { 10, 9, 20, 19, 1, 8, 9, 22, 0, 91 };
    quick(num, 0, 9);
    show(num, 10);

    system("pause");
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注