您的位置:首页 > 其它

快速排序

2016-06-20 17:15 225 查看
快排是最快的算法之一,主要使用了分治策略。

思路

第一步,将待排序序列 aa 分成两部分 bb 和 cc,其中 bb 部分的每个元素小于等于 cc 部分中的所有元素。第二步,递归的使用相同程序处理序列 bb 和 cc 。



图1 Quicksort(n)Quicksort(n)

步骤一具体做法,先选择一个元素 xx,所有小于 xx 的元素放到第一部分 bb 中,所有大于 xx 的元素放到第二部分 cc 中,等于 xx 的元素放到哪边都可以。下面的算法中,对于等于 xx 的元素,被放到任何一个部分都有可能。

partitionpartition算法

版本一

输入:序列 a0,...,an−1a_0,...,a_{n-1}

输出:序列的一个置换,其中 a0,...,aja_0,...,a_j 小于等于 ai,...,an−1ai,...,a_{n-1} (i>ji>j)

算法:

x=a[(n-1)/2]
i = 0 and j = n-1
while i<=j:
搜寻第一个大于等于 x 的元素 a[i]
搜寻最后一个小于等于 x 的元素 a[j]
if i<=j:
exchange(a[i],a[j])
i=i+1 and j = j-1


注意这个版本的 partitionpartition 并不一定能把 xx 放到它的最终位置。因为元素xx也参与了交换。如果想得到 xx 的最终位置,算法如下。

版本二

输入:序列 a0,...,an−1a_0,...,a_{n-1}

输出:序列的一个置换和枢轴的位置,其中 a0,...,aj−1≤aj≤aj+1,...,an−1a_0,...,a_{j-1}\leq a_j \leq a_{j+1},...,a_{n-1}

算法:

x=a[0]
i = 1 and j = n-1
while i<=j:
搜寻第一个大于等于 x 的元素 a[i]
搜寻最后一个小于等于 x 的元素 a[j]
if i>=j:
break
exchange(a[i],a[j])
i=i+1 and j = j-1
exchange(a[0], a[j])
return j;


C语言代码

版本一:

void exchange(int a[], int i, int j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void quickSort(int a[], int lo, int hi){
if(lo >= hi) return;
int x = a[lo+(hi-lo)/2];
int i = lo, j = hi;
// partition
while(i <= j){
while(a[i] < x)++i;
while(x < a[j])--j;
if (i <= j){
exchange(a, i++, j--);
}
}
// recursion
quickSort(a, lo, j);
quickSort(a, i, hi);
}


版本二

这里给一个partitionpartition版本的代码

int partition(int a[], int lo, int hi){
int i = lo, j = hi + 1;
int x = a[lo];
while(true){
while(a[++i] < x) if(i == hi) break;
while(x < a[--j]) if(j == lo) break;
if(i >= j) break;
exchange(a, i, j);
}
exchange(a, lo, j);
return j;
}
void quickSort(int a[], int lo, int hi){
if(lo <= hi) return;
int j = partition(a, lo, hi);
quickSort(a, lo, j - 1);
quickSort(a, j + 1, hi);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: