6-7 案例:数组元素的排序 快速排序篇

1. 快排在每次排序之前都需要选定好一个元素(枢轴元素),然后把比它小的元素放在左边,把比它大的元素放在右边,从另一个角度来看,快排其实每次都是帮助一个元素找定它在数组中的位置。

2. 如果一个数组已经排好序,找到了枢轴元素的位置:

把枢轴元素前面的数组位置当做一个个坑,那么我们要做的事情就是把小于枢轴元素的值放入坑中,大的元素每次都直接跳过,代码实现起来就是:(由于一开始枢轴元素选定是可以随便选的,所以选取数组中最后一个元素当做枢轴元素)

// length 为 array 数组的元素个数

int pivot = array[length-1]; // 最后一个元素当做枢轴元素

int partition = 0;  // 坑的位置

for (int i = 0; i < length-1; ++i) {    // 只扫描一遍数组
  
  if(array[i] < pivot){    // 如果比枢轴元素小

    Swap(array,i,partition);    // 交换数组中 i 元素和 partition 元素的位置
    
    partition++;    // 一个坑占满,找下一个坑
  
  }
}

把坑占满后,由于每次填坑之后,坑的位置会++,所以此时枢轴元素的位置实际上是比枢轴元素值大的第一个元素,再交换它与选定的枢轴元素

Swap(array,partition,right); // 交换最后一个元素和第一个比枢轴元素大的坑

这样,一次快排就完成了,剩下的需要利用递归,完整代码如下:

#include <stdio.h>

// 数组元素交换
void Swap(int array[], int first, int second){
  int temp = array[first];
  array[first] = array[second];
  array[second] = temp;
}

int Partition(int array[], int left, int right){
  int pivot = array[right]; // 最后一个元素当做枢轴元素

  int j = left;
  for (int i = left; i < right; ++i) {
    if(array[i] < pivot){    // 如果比枢轴元素小
      Swap(array,i,j);
      j++;
    }
  }

  Swap(array,j,right); // 交换最后一个元素和第一个比枢轴元素大的坑

  return j;
}

void QuickSort(int array[], int left, int right){

  if(left >= right)    // 递归的结束条件不能忘啊!!!
    return;

  int partition = Partition(array, left, right);
  QuickSort(array, left, partition-1);
  QuickSort(array, partition+1, right);
}

int main(){

  int array[] = {6,6,7,0,2,1,4,5,6,7};

  QuickSort(array, 0,9);

  for (int i = 0; i < 10; ++i) {
    printf("%d ", array[i]);
  }

  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值