快速排序算法理解

      快速排序是一个比较经典的可以考察编程基本功的的问题。本人就自己的理解进行简单的纪录,以备日后查阅。       

   “挖坑填数”法,是很多博客对快速排序的一个思想总结,本人对此思想比较接受,也容易理解。下面笔者用一个场景来理解快速排序过程。      

      大家都知道快速排序的一个主要过程就是Partion过程,即选择一个基准,将数组的大于基准的元素放在基准的右边,小于基准的放在其左边。步骤如下:

    1>选择基准(一般选择第一个元素。当然这种方式不是最好的!)

        temp=array[start];此时第一个位置可以看做一个“坑”。

    2>双向循环扫描,“挖坑填数”操作

        i=start, j=end;

       while(i<j&&temp>array[j]) j--; 从右向左扫描数组,找到一个小于基准的元素,将其放入坑中。否则一直向前。

       array[i]=array[j] ;入坑操作

       i++;

      然后从前向后扫描也进行“挖坑填数”。

      while(i<j&&temp>array[i]) i++; 从左往右扫描数组,找到一个大于于基准的元素,将其放入坑中。否则一直向后。

      array[j]=array[i] ;入坑操作

       j;

        当i=j时,跳出循环。

         3> 由于此时temp还从在外面,数组中还有一个坑,将temp入坑。

         

代码:

#include "stdafx.h"

#include <vector>
#include <iostream>
using namespace std;

int partion(int *Array,int start,int end )
{
int temp=Array[start];
int i=start,j=end;
while(i<j)
{
while(i<j&&Array[j]>temp) j--;
if(i<j) Array[i++]=Array[j];
while(i<j&&Array[i]<temp) i++;
if(i<j) Array[j--]=Array[i];
}
Array[i]=temp;
return i;
}

void QuikSort(int *Array,int start,int end)
{   
if(start<end)
{  
  int base=partion(Array,start,end);
  QuikSort(Array,start,base-1);
  QuikSort(Array,base+1,end);
}
}
int _tmain(int argc, _TCHAR* argv[])
{   
int array[]={34,65,12,43,67,5,78,10,3,70};
int len=sizeof(array)/sizeof(int);
QuikSort(array,0,len-1);
    
for(int i=0;i<len;++i)
cout<<array[i]<<endl;
getchar();
return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值