数据结构/排序/快速排序 --- 逻辑讲解、代码实现、图形展示

一、总体逻辑:

        1. 选基准数

        2. 定义俩指针,分别指向数组的(出去基准数的)头和尾,然后相向移动。

        3. 左指针找大于基准数的,右指针找小于基准数的

        4. 左右指针同时找到,然后交换位置

        5.做右指针重合的点和基准数互换位置,此时基准数左边全部小于基准数,基准数右边全部大于基准数

        6. 对基准数左边和右边分别进行快速排序

二、解释:

        1. 选基准数,以第一个为基准数

        2. 通过前面的 “对基准数左边和右边分别进行快速排序” ,可看出,很显然要用递归,虽然内存消耗大吧,但是它代码简洁嘛

        3. ”左右指针相向移动“ 中的相向不是相同方向的意思奥,而是:

        

        4. 然后左指针找到大于基准数的数,并且右指针找到小于基准数的数时,两个指针交换他们找到的数值,即:

       

三、接着就是循环:

        1. 递归没什么好讲的,就是传参的时候记得是动态的。
                

四、代码附上:

#include <stdio.h>

void printArr(int *arr, int len)
{
  for (int i = 0; i < len; i++)
    printf("%d ", arr[i]);
  printf("\n");
}

void quickSort_circulation(int *arr, int i, int j)
{
  // 左指针
  int start = i;
  // 右指针
  int end = j;

  if (start > end)
  {
    return;
  }

  // 基准数
  int baseNum = arr[i];

  // 循环寻找
  while (start != end)
  {
    // 右指针寻找小于基准数的
    while (1)
    {
      if (end <= start || arr[end] < baseNum)
        break;
      end--;
    }
    // 左指针寻找大于基准数的
    while (1)
    {
      if (end <= start || arr[start] > baseNum)
        break;
      start++;
    }
    // 将两个指针指向的元素交换位置
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
  }
  // 基准数归位
  int temp = arr[i];
  arr[i] = arr[start];
  arr[start] = temp;

  // 对基准数左边的数组进行快速排序
  quickSort_circulation(arr, i, start - 1);
  // 对基准数右边的数组进行快速排序
  quickSort_circulation(arr, start + 1, j);
}

void main()
{
  int arr1[] = {5, 6, 2, 9, 8, 7, 3, 1, 4};
  int len = sizeof(arr1) / sizeof(int);

  printf("排序前:\n");
  printArr(arr1, len);
  quickSort_circulation(arr1, 0, len - 1);
  printf("排序后:\n");
  printArr(arr1, len);
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值