快速排列

快速排列

算法简介

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
习题链接

算法实现步骤

  1. 找到一个基准数

  2. 将数组里的数字大于基准数的放到基准数的右边小于基准数的放到基准数的左边(本题是以升序排列,如果降序排列则相反)

  3. 排序完成后,使用递归重复1步骤和2步骤,最后找一个出口终止循环。

伪代码示范

#include<stdio.h>
    int main()
{
    读取你要输入几个数字
    找到基准数
    对数组进行排序
    再找一个基准数继续排序
    给出递归出口
    输出结果
}

难点详解

怎么找到初始基准数

初始基准数一般默认为数组的第一个数字或者最后一个数字。
其实随便哪个数都行,全凭读者意愿。

如何将数组排序

设定基准数后设置一个判断条件为真则不动,为假则交换位置。
代码示例:

    while(first < last)//此条件为排序是否完成的标志
    {
        while(first < last && arr[last] > key)
        {
            last--;
        }
        
        arr[first] = arr[last];//交换以升序排列

        while(first < last && arr[first] < key)
        {
            first++;
        }
        
        arr[last] = arr[first];//交换以升序排列
    }

排序完成后如何再找出基准数

排序完成后将排序结束的那个点的数组下标设置为基准数

代码示例:

    arr[first] = key;

如何递归

每次递归都使两个数组下标相互逼近

代码示例:

    QuickSort(arr, low, first-1);
    QuickSort(arr, first+1, high);

递归出口

找到一个能完成排列的条件。

代码示例:

 if(low >= high)
        return;

源代码

void QuickSort(int arr[], int low, int high);
void Read(int n,int a[]);
void Put(int n,int a[]);
int main(void)
{
    int i,n,a[10];
    printf("How many Numbers dou you want to enter:\n");
    scanf("%d",&n);
    printf("Please enter n Numbers that you want to enter:\n");
    Read(n,a);
    QuickSort(a, 0, (n-1));
    printf("In ascending order,the result is:\n");
    Put(n,a);
    return 0;
}
void QuickSort(int arr[], int low, int high)
{
    int first = low;//数组第一个下标
    int last  = high;//数组最后一个下标
    int key = arr[first];//就将数组第一位的值作为特征值
    if(low >= high)//返回条件,因函数使用了递归
        return;
    while(first < last)
    {
        while(first < last && arr[last] > key)
        {
            last--;
        }
        arr[first] = arr[last];//交换以升序排列

        while(first < last && arr[first] < key)
        {
            first++;
        }
        arr[last] = arr[first];//交换以升序排列
    }
    arr[first] = key;
    
    QuickSort(arr, low, first-1);
    QuickSort(arr, first+1, high);
}
void Read(int n,int a[])
{
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
}
void Put(int n,int a[])
{
    for(int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
}

运行结果

posted @ 2020-12-09 21:48  HanWDragon  阅读(124)  评论(0)    收藏  举报