算法导论 第七章快速排序中两种swap函数实现方式比较
2011-02-15 22:31
405 查看
#include <iostream> #include <cstdlib> #include <time.h> using namespace std; void Swap(int array[] , int i , int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } int Partition(int array[] , int begin , int end) { int sentinel = array[end]; int i = begin-1; for(int j=begin ; j<end ; j++) { if(array[j] <= sentinel) { i++; Swap(array , i , j); } } Swap(array , i+1 , end); return i+1; } void QuickSort(int array[] , int begin , int end) { int q; if(begin < end) { q = Partition(array , begin , end); QuickSort(array , begin , q-1); QuickSort(array , q+1 , end); } } int main() { const int n = 100; int a ; srand(time(0)); for(int i=1 ; i<n ; i++) { a[i] = rand()%1000; } QuickSort(a , 1 , n-1); for(int i=1 ; i<n ; i++) { cout << a[i] << ' '; } cout << endl; return 0; }
#include <iostream> #include <cstdlib> #include <time.h> using namespace std; void swap(int array[] , int i , int j) { if(i!=j) //This comparision is most important. { //Because function Partition always let its element exchang itself. //cout << array[i] << ' ' << array[j] << endl; array[i] = array[i]+array[j]; array[j] = array[i]-array[j]; array[i] = array[i]-array[j]; //cout << array[i] << ' ' << array[j] << endl; } } int Partition(int array[] , int begin , int end) { int sentinel = array[end]; int i = begin-1; for(int j=begin ; j<end ; j++) { if(array[j] <= sentinel) { i++; swap(array , i , j); } } swap(array , i+1 , end); return i+1; } void QuickSort(int array[] , int begin , int end) { int q; if(begin < end) { q = Partition(array , begin , end); QuickSort(array , begin , q-1); QuickSort(array , q+1 , end); } } int main() { const int n = 10; int a ; srand(time(0)); for(int i=1 ; i<n ; i++) { a[i] = rand()%100; } for(int i=1 ; i<n ; i++) { cout << a[i] << ' '; } cout << endl; QuickSort(a , 1 , n-1); for(int i=1 ; i<n ; i++) { cout << a[i] << ' '; } cout << endl; return 0; }
使用swap函数时要注意是否需要自赋值比较,如果i和j可能相等,则在使用第二
个版本的swap函数时一定要比较i和j,在第一个版本的swap函数中加入比较语
句,也是会提高效率的。
相关文章推荐
- 算法导论 第七章快速排序和两种swap函数实现方式比较
- 算法导论 第七章快速排序中两种swap函数实现方式比较
- 交换函数的两种不同的实现方式------地址传递和引用参数
- springMVC两种方式实现多文件上传及效率比较
- 归并排序(MergeSort)两种实现方式比较
- springMVC两种方式实现多文件上传及效率比较
- C++中priority_queue的比较函数重载的两种方式
- 两种AOP实现方式的性能比较
- springMVC两种方式实现多文件上传及效率比较
- STL工具库使用解析系列之二:自定义比较函数的两种方式(重载和仿函数)
- springMVC两种方式实现多文件上传及效率比较
- Android开发中FPS游戏实现的两种方式比较
- AsyncTask和Handler两种异步方式的实现和区别比较
- springMVC两种方式实现多文件上传及效率比较
- 关于APUE里面TELL_WAIT()之类函数的两种实现方式
- springMVC两种方式实现多文件上传及效率比较
- AsyncTask和Handler两种异步方式的实现和区别比较
- 详解springMVC两种方式实现多文件上传及效率比较
- springMVC两种方式实现多文件上传及效率比较
- Java、Scala、Go以相同方式实现快速排序代码量比较