快速排序的实现

375 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

说到快速排序,可能大家都不会陌生。今天的算法课程中,学到了快速排序的两种中间实现步骤,给大家分享一下。

1.快速排序的思想

首先还是过一遍快速排序的基本思想。

用我自己的话总结一下,就是:

  1. 在比较序列中取关键值key
  2. 将序列中比key值大的放在key的一侧,比key值小的放在另一则
  3. 分别对左右两侧重复进行1、2操作

从步骤中我们能够清晰地明白这是一种分而治之的思想,因此在代码中的体现就是使用递归。

2.对于步骤2的解析

作为算法的主要部分,我们需要知道如何实现步骤2,即将大的放在一边,小的放在另一边。

从字面上来看,这个步骤似乎实现起来并不难,但我们的算法依然有许多考究之处。

v2-d4e5d0a778dba725091d8317e6bac939_b.gif

[图片来源](【算法】排序算法之快速排序 - 知乎 (zhihu.com))

2.1

左右分开找

int partition(int arr[], int low, int high){
    int key;
    key = arr[low];
    while(low<high){
        while(low <high && arr[high]>= key )
            high--;
        if(low<high)
            arr[low++] = arr[high];
        while( low<high && arr[low]<=key )
            low++;
        if(low<high)
            arr[high--] = arr[low];
    }
    arr[low] = key;
    return low;
}

具体思路参考下图

20190320151833851.gif [图片来源]( 快速排序的两种实现方法(c语言版本)_雪峰流云-CSDN博客)

2.2

从一端“过滤”

image.png



int partition(int arr[], int low, int high){
    int i=high;
    int m=high;
    int key =arr[high];
    
    while(i>=low){
    	if(arr[i]>key){
    		int temp=arr[m];
    		arr[i]=arr[m];
    		arr[m]=temp;
    		m--;
		}
	    i--;
	}
	int temp=arr[high];
	arr[high]=arr[m+1];
	arr[m+1]=temp;
	printf("\n%d",m);
    return m+1;
}