排序算法-快速排序(直观总结分析)

快速排序算法是比较经典的排序算法。

但其中心思想还是比较简单的,就是“挖坑”和“填坑”的过程。

这里的“坑”经常会被随机化,以防止快排的最坏情况出现。当然,我们拿到一个数列后,也可以先将该数列整体随机化,从而避免每次都要随机“选坑”。

今天重新复习了一下,也总结了不同形式的快排~总结如下:


1. 常见的快速排序形式:

#include <iostream>
using namespace std;

void quickSort(int *array, int Begin, int End)
{
  if(Begin<End)
  {
    int begin = Begin;
    int end = End;
    int temp = array[end];//挖坑 
    while(begin<end)
    {
      while(begin<end && array[begin]<=temp) begin++; 
      if(begin<end) array[end--] = array[begin];  //从前向后填坑 
      while(begin<end && array[end]>=temp) end--;
      if(begin<end) array[begin++] = array[end];  //从后向前填坑 
    }
    array[begin]=temp; //填上“中间”的坑 
    
    quickSort(array, Begin, begin-1);//递归 
    quickSort(array, begin+1, End);
  }
}

//输出数组 
void printArray(int *array, int length)
{
  for(int i=0; i<length; i++)
    cout<<array[i]<<"\t";
  cout<<endl;
}

int main()
{
  int array[5]={4, 2, 1, 7, 5};
  printArray(array, 5);
  
  quickSort(array, 0, 5); 
  printArray(array, 5);
  
  system("pause");
  return 0;
}

2.另一种形式(见《剑指offer》P64)

int Partion(int data[], int length, int start, int end)
{
  if(data == NULL || length<=0 || start<0 || end >=length)
    throw new std::exception("Invalid Parameters");
  
  int index = RandomInRange(start, end);//挖坑 
  Swap(&data[index], &data[end]);
  
  int small = start-1; //small变量的设置是它与传统快排最大的不同之处
  for(index = start; index < end; ++ index)
  {
    if(data[index] < data[end])
    {
      ++small; //small总是指向比“坑”中数字大的前一个数字
      if(small != index)
        Swap(&data[index], &data[small]);
    }
  }
  ++small;
  Swap(&data[small], &data[end]);
  
  return small; 
} 

void QuickSort(int data[], int length, int start, int end)
{
  if(start == end) return;
  
  int index = Partion(data, length, start, end);
  if(index > start) QuickSort(data, length, start, index-1);
  if(index < end)   QuickSort(data, length, index+1, end);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值