[算法] 两种快速排序的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; }
相关文章推荐
- 快速排序(快排)算法的C++两种实现
- 算法:快速排序(快速排序其实有很多种不同写法和代码形式)
- 算法笔记 之 快速排序的几种写法
- 探讨两种快速排序写法与堆溢出的关系
- RMQ的ST写法和线段树写法两种姿势
- 求最大子列和问题两种算法比较
- 自定义拦截器的两种写法
- Fibonacci sequence两种实现算法及其复杂度分析
- Javascript实现快速排序(Quicksort)的算法详解
- KMP算法之while循环部分
- 普通快速排序的两种实现
- webconfig中连接的两种写法
- 算法练习之——快速排序
- 动手实现 算法 之 “快速排序”
- lotus在ls里取当前时间的两种写法
- 计算最大公约数的两种算法:辗转相除法和Stein算法
- 算法-冒泡排序和快速排序
- 【经典算法】快速排序
- 面试算法——寻找第K大的数(快速排序的应用)
- 有意思的排序算法-快速排序