QuickSort
来源:互联网 发布:windows键盘command键 编辑:程序博客网 时间:2024/06/06 01:32
快速排序基本思想:
对于partitioning的几点说明:
1. 把数组中最右边的元素作为partitioning element;
2. 从左向右扫描数组的元素,遇到 ">=partitioning element" 的情况就停止扫描;
3. 从右向左扫描数组的元素,遇到 "<=partitioning element" 的情况就停止扫描。
#include <iostream>#include <time.h>using namespace std;void quicksort(int a[], int l, int r);int partition(int a[], int l, int r);void swap(int *a, int *b);int main(){int n;int *arr;cin>>n;arr = new int[n];srand(unsigned(time(NULL)));for (int i=0; i<n; i++){// arr[i] = 10;// 测试所有值都相等的数组// arr[i] = 15 - i;// 测试逆序数组// arr[i] = i;// 测试正序数组arr[i] = rand() % 100;// 测试随机数组}cout<<"Original Sequence"<<endl;for (int i=0; i<n; i++){cout<<arr[i]<<" ";}cout<<endl;quicksort(arr, 0, n-1);cout<<"Sorted Sequence"<<endl;for (int i=0; i<n; i++){cout<<arr[i]<<" ";}cout<<endl;system("pause");return 0;}void swap(int *a, int *b){int temp = *a;*a = *b;*b = temp;}void quicksort(int a[], int l, int r){if (l >= r){return ;}int pivot = partition(a, l, r);quicksort(a, l, pivot-1);quicksort(a, pivot+1, r);}int partition(int a[], int l, int r){int i = l-1, j = r;int v = a[r];for ( ; ; ){// 注意:此处必须先++// 特殊测试用例:所有元素都相等的数组while (a[++i] < v){}// 注意:此处必须先--while (v < a[--j]){if (j == l){break;}}if (i >= j){break;}swap(&a[i], &a[j]);}// 注意:此处必须交换i位置上的元素和partitioning element,// 不能交换j位置上的元素和partitioning element;// 特殊测试用例:有序数组swap(&a[i], &a[r]);return i;}
优化1:
// An iterative implementation of quick sort#include <iostream>#include <time.h>using namespace std;void swap(int *a, int *b);int partition(int a[], int l, int r);void quicksortIterative(int a[], int l, int r);int main(){int n; int *arr; cin>>n;arr = new int [n];srand(unsigned(time(NULL)));for (int i=0; i<n; i++){arr[i] = rand() % 1000;}cout<<"Original Sequence"<<endl;for (int i=0; i<n; i++){cout<<arr[i]<<" ";}cout<<endl; quicksortIterative(arr, 0, n-1);cout<<"Sorted Sequence"<<endl; for (int i=0; i<n; i++){cout<<arr[i]<<" ";}cout<<endl;system("pause"); return 0;}void swap(int *a, int *b){int temp = *a;*a = *b;*b = temp;}int partition(int a[], int l, int r){int i = l - 1;int j = r;int v = a[r];for ( ; ; ){while (a[++i] < v){}while (v < a[--j]){if (j == l){break;}}if (i >= j){break;}swap(&a[i], &a[j]);}swap(&a[i], &a[r]);return i;}void quicksortIterative (int arr[], int l, int r){ int *stack;stack = new int [r-l+1]; int top = -1; stack[ ++top ] = r; stack[ ++top ] = l; while ( top >= 0 ) { l = stack[ top-- ]; r = stack[ top-- ]; if (r <= l){continue;} int i = partition(arr, l, r); // 保证左右两个子文件中较大的先入栈// 这样可以减少栈的深度if (i-1 > r-i){stack[++top] = i-1;stack[++top] = l;stack[++top] = r;stack[++top] = i+1;}else{stack[++top] = r;stack[++top] = i+1;stack[++top] = i-1;stack[++top] = l;} }}
Median-of-Three Partitioning
// An iterative implementation of quick sort#include <iostream>#include <time.h>using namespace std;void swap(int *a, int *b);int partition(int a[], int l, int r);void quicksortIterative(int a[], int l, int r);int main(){int n; int *arr; cin>>n;arr = new int [n];srand(unsigned(time(NULL)));for (int i=0; i<n; i++){arr[i] = rand() % 1000;}cout<<"Original Sequence"<<endl;for (int i=0; i<n; i++){cout<<arr[i]<<" ";}cout<<endl; quicksortIterative(arr, 0, n-1);cout<<"Sorted Sequence"<<endl; for (int i=0; i<n; i++){cout<<arr[i]<<" ";}cout<<endl;system("pause"); return 0;}void swap(int *a, int *b){int temp = *a;*a = *b;*b = temp;}int partition(int a[], int l, int r){int i = l - 1;int j = r;int v = a[r];for ( ; ; ){while (a[++i] < v){}while (v < a[--j]){if (j == l){break;}}if (i >= j){break;}swap(&a[i], &a[j]);}swap(&a[i], &a[r]);return i;}void quicksortIterative (int arr[], int l, int r){ int *stack;stack = new int [r-l+1]; int top = -1; stack[ ++top ] = r; stack[ ++top ] = l; while ( top >= 0 ) { l = stack[ top-- ]; r = stack[ top-- ]; if (r <= l){continue;} int i = partition(arr, l, r); // 保证左右两个子文件中较大的先入栈// 这样可以减少栈的深度if (i-1 > r-i){stack[++top] = i-1;stack[++top] = l;stack[++top] = r;stack[++top] = i+1;}else{stack[++top] = r;stack[++top] = i+1;stack[++top] = i-1;stack[++top] = l;} }}
- Quicksort
- QuickSort
- quicksort
- quicksort
- QuickSort
- QuickSort
- QuickSort
- QuickSort
- QuickSort
- QuickSort
- quicksort
- QuickSort
- QuickSort
- QuickSort
- quicksort
- quicksort
- QuickSort
- Quicksort
- Linux实用的主要数据结构
- android 获取网络状态和设置网络
- 处理SQL语句中出现的'&'特殊字符
- 6:Flip Game
- MySQL集群 MySQL Cluster
- QuickSort
- linux下c语言操作mysql数据库!
- C#.net Winform 如何将窗体嵌入Panle中
- sudo apt-get install libncurses5-dev不能成功安装的解决办法
- 如何创建组播应用程序
- Spring所有开源项目介绍
- sqlite3_open_v2(“/data/data/com.android.packagename/databases/dump.sqlite”, &handle, 1, NULL) failed
- 成员函数指针与高效C++委托 (delegate)
- javaBean和Servlet的区别