前言
快速排序应该是我目前遇到的排序中比较难懂的一个,在这里我将详细展示自己的理解过程,希望能够帮助到大家,至少能做个参考吧
快排原理
这里我给出一组数{7,9,3,2,4,8},我们任意选择一个数作为关键数,这里我们就都以最左边的数作为关键数,即“7”。接下来我们就要判断后面的数和7的大小关系,小于7的分为1组,大于7的另成1组,即{7,3,2,4,8,9}。(这里只是介绍原理,实际的排序以程序运行为准)然后我们再把7放到中间,(这里只需要把7和4交换)即{4,3,2,7,8,9},然后这堆数就分成了两组我
们现在只需要对这两组数重复上面的方法即可,直到每一组只剩下1个数。这里我简单记录一下排序过程
如果想要更深入理解快排的话可以看看这个视频冒泡排序,插入排序,快速排序的对比
程序实现
这里我只介绍一下排序的函数
void sort(int a[],int left,int right){
int l=left,r=right,key=a[l],temp;//key代表关键值,我们始终选择相对左值为关键值,temp作为媒介值使用,用于交换数据。
注意,这里的left表示绝对的“左”,其值始终为0;而l表示相对的“左”,其值会变化。right和r一样。
接下来是分组,即小于key的值为一组,大于key为另一组
while(l<r){//l的初始值为left,r为right,分别对应左右两边两个数
while(l<r&&a[r]>key)r--;//从最右边开始判断,若此值大于key值则r-1,判断前面一个值,直到a[r]<=key。
while(l<r&&a[l]<=key)l++;//因为key值在最左边,所以判断第一个数时肯定是相等的即a[l]=key所以要加=
temp=a[l],a[l]=a[r],a[r]=temp;//交换值!
}
这段代码可能会比较难懂,这里我给出它的图解
交换过后程序会循环,直到l和r重合,然后我们就可以把key值与lr重合位置的值交换,这样key值就到中间去了,数据被分成了两组,一大一小
temp=a[left],a[left]=a[l],a[l]=temp;
最后,只需要把分成的两组数据重复上述操作,直到每组只剩1个数据即可
if(left<l-1)sort(a,left,l-1);//如果该组只有一个数据,if就不成立
if(right>r+1)sort(a,r+1,right);
所有代码如下
void sort(int a[],int left,int right){//left表示绝对左值,l表示相对左值
int l=left,r=right,key=a[l],temp;//选择关键值 ,定义媒介值
while(l<r){
while(l<r&&a[r]>key)r--;
while(l<r&&a[l]<=key)l++;
temp=a[l],a[l]=a[r],a[r]=temp;
}
temp=a[left],a[left]=a[l],a[l]=temp;
if(left<l-1)sort(a,left,l-1);
if(right>r+1)sort(a,r+1,right);
}
总结
以上就是所有内容,对于一些比较复杂难懂的程序可以将其写到纸上分析,按照程序一步一步地进行,这对程序的理解很有帮助。