您的位置:首页 > 其它

[算法] 两种快速排序的while写法

2014-11-02 12:49 176 查看
直接上代码,具体思路见注释。

#include <time.h>
#include <stdio.h>
#include <iostream>
using namespace std;

// 这种方法是交替使用A[i]或者A[j]作为基准,比qsort_2少使用一个中间变量base,但是每次交换是两次赋值,成本大一些
void qsort_1(int A[], int l, int r)
{
if(l >= r) // 注意:这里不加可能崩溃
return;

int i,j;
i = l;
j = r;
while(i < j)
{
// 注意:while里面要用>=,否则如果数组的数值都相同的话,就肯定出不了外面的循环
while(i < j && A[i] <= A[j]) j--; // 以A[i]作为基准
swap(A[i], A[j]);
while(i < j && A[i] <= A[j]) i++; // 以A[j]作为基准,其实就是刚才的A[i],所以基准其实一直没变
swap(A[i], A[j]);
}

// 出来循环A[l]=A[r]就是那个基准
qsort_1(A, l, i-1);
qsort_1(A, i+1, r);
}

// 这种方法是使用A[i]或者A[j]作为可以放置的位置,对A[i]和A[j]的定义不同于qsort_1
void qsort_2(int A[], int l, int r)
{
if(l >= r)
return;
int i,j,base;
i = l;
j = r;
base = A[l]; // 可以放置的位置,初始化为A[l],即A[i]
while(i < j)
{
while(i < j && A[j] >= base) j--;
A[i] = A[j]; // 可以放置的位置变化:原来是A[i],变成A[j]
while(i < j && A[i] <= base) i++;
A[j] = A[i]; // 可以放置的位置变化:原来是A[j],变成A[i]
}
A[i] = base;
qsort_2(A, l, i-1);
qsort_2(A, i+1, r);
}

/*
测试代码
*/
int cmp(const void *x, const void *y)
{
return *(int*)x - *(int*)y;
}

void printArray(int array[], int n)
{
for(int i=0; i<n; i++)
cout << array[i] << " ";
cout << endl;
}

#define N 10
#define MAX 20
int main()
{
int A
;
int B
;
int C
;
// 随机数 http://blog.csdn.net/woxueliuyun/article/details/2132543 srand( (unsigned)time( NULL ) );
for(int i=0; i<10; i++)
{
A[i] = B[i] = C[i] = rand() % MAX;
}

printArray(A, N);
qsort(A, N, sizeof(A[0]), cmp);
qsort_1(B, 0, N-1);
qsort_2(C, 0, N-1);
printArray(A, N);
printArray(B, N);
printArray(C, N);

return 0;
}

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