或许在面试与笔试中问的最多的就是这个快速排序算法(Quick sort)。
其实吧,这个快速排序的思想呢,很简单。
所谓快速排序就是,起始的时候选择一个关键值key一般为数组的第一个值,然后将数组分割成两部分,前一部分全部小于key,后一部分全部大于key,然后前一部分与后一部分分别进行这样的分组,结束后所得的序列就是有序的。
看吧思想炒鸡简单吧~但是实现呢?就有些纠结了,从上面的过程中可以明显看出使用了递归的方法。
从上面算法描述的过程中可以看出,寻找这个安排key值的位置是本算法的核心部分。下面看一下寻找的实现代码:
void swapdata(int arr[],int i,int j) { int temp; temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; }
int find_key(int arr[],int low,int high) { int key; key=arr[low]; while(low<high) { while(low<high && arr[high]>key) high--; swapdata(low,high); while(low<high && arr[low]<key) low++; swapdata(low,high); } return low; }
这里为了便于理解,我只说明首次寻找keylocation的过程。按照如下的图示:low以红色表示,high以浅绿色表示:
以上的寻找Key值的思想,可以这么描述:
起始位置从末尾开始,遇到比key值小的就停止搜索,交换小值到前面;然后从头开始找,遇到比key值大的就停止搜索,交换key值到当前位置。然后一直找完整个数组就停止。
然后有了以上寻找key的过程,结合快速排序的思想,则快速排序的实现代码如下:
void fast_sort(int arr[],int low,int high) { int keylocation; if(low<high) { keylocation=find_key(arr,low,high); fast_sort(arr,low,keylocation); fast_sort(arr,keylocation+1,high); } } void Qsort(int arr[],int length) { fast_sort(arr,0,length-1); }