快速排序是一个比较经典的可以考察编程基本功的的问题。本人就自己的理解进行简单的纪录,以备日后查阅。
“挖坑填数”法,是很多博客对快速排序的一个思想总结,本人对此思想比较接受,也容易理解。下面笔者用一个场景来理解快速排序过程。
大家都知道快速排序的一个主要过程就是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;
}