您的位置:首页 > 其它

快速排序

2015-01-10 19:51 218 查看
       由于惰性,这两天一直没有写博客,昨天晚上认真的反思自己。话不多说,就利用现在的时间,我就简单的整理一下快速排序这个算法吧。

算法思想(以线性表的升序为例):

       通俗来说,就是选一个数当作基准,比它小的放在它的左边,比它大的放           在它的右边,那么这个线性表就按照这个基准被分为了两部分,然后对它的前           半部分和后半部分进行相同的操作,以此类推,一直进行下去,则线性表整体           有序。

       显然,这个不断二分线性表的想法用到了分治法的思想。因此,会使得问
题规模每次缩小一半,从而提高效率。不难算出它的O(n) = nlogn。


        关于快排的算法有很多种的写法,而我基准元素的选取是选取的第一个元
素,如果你比较任性,想选别的元素作 为基准元素,只需要进行类似交换的
操作(至于为什么只用两步的交换操作,不用第三步,你可以自己思考),那 么就请看看我的代码是如何描写这个过程的,代码如下:


#include <iostream>
using namespace std;
int QSort(int a[], int low, int high);
void Depart(int a[], int low, int high);
int main(){
int i, a[10];
for (i = 0; i < 10; i++){
cin >> a[i];
}
Depart(a, 0, 9); //此处应是长度减一
for (i = 0; i < 10; i++){
cout << a[i];
}
return 0;
}
int QSort(int a[], int low, int high){ //对划分好的区间进行排序操作
int i, j, x = a[low];
i = low;
j = high; //由于传过来的是长度减一,所以这块可以直接将high赋值给j,访问a[j],不会越界
while (i < j){
//最开始形成的坑在前面,所以,从后面找元素来填坑
while (i < j && a[j] >= x){//找小值
j--;
}
if (a[j] < x){
a[i] = a[j]; //填后面的坑,前面产生新坑
i++;
}
while (i < j && a[i] < x){ //找符合的大值
i++;
}
if (a[i] >= x){
a[j] = a[i]; //填前面的坑,后面产生新坑
j--;
}

}
a[i] = x;

return i;
}
void Depart(int a[], int low, int high){ //Depart主要用来划分区间
int mid;
if (high > low){
mid = QSort(a, low, high);
Depart(a, low, mid - 1);
Depart(a, mid + 1, high);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: