经典排序——归并、快排递归与非递归实现与冒泡排序
2013-05-05 10:52
429 查看
#include <iostream> #include <cstdlib> #include <ctime> #include <cstdio> #include <stack> using namespace std; void merge(int a[],int b[],int l,int mid,int r){ int i = l, j = mid + 1; int k = 0; while(i <= mid && j <= r){ if(a[i] <= a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while(i <= mid) b[k++] = a[i++]; while(j <= r) b[k++] = a[j++]; for(i = 0 ; i < k; i ++) a[i+l] = b[i]; } void mergesort_recursive(int a[],int b[],int l,int r){ if(l < r){ int mid = (l + r) >> 1; mergesort_recursive(a,b,l,mid); mergesort_recursive(a,b,mid+1,r); merge(a,b,l,mid,r); } } void merge2(int a[],int b[],int l,int mid,int r){ int i = l, j = mid + 1; int k = l; while(i <= mid && j <= r){ if(a[i] <= a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while(i <= mid) b[k++] = a[i++]; while(j <= r) b[k++] = a[j++]; } void mergepass(int a[],int b[],int s,int n){ int i = 0; while(i <= n - 2*s){ merge2(a,b,i,i+s-1,i+2*s-1); i += 2*s; } if(i + s < n) merge2(a,b,i,i+s-1,n-1); else for(int j = i ; j < n ; j ++) b[j] = a[j]; } void mergesort_unrecursive(int a[],int n){ int *b = new int ; int s = 1; while(s < n){ mergepass(a,b,s,n); s += s; mergepass(b,a,s,n); s += s; } // for(int i = 0 ; i < n ; i ++) // printf("%d ",a[i]); } bool MergeSort1(int a[],int n){ int *b = new int ; if(b == NULL) return false; mergesort_recursive(a,b,0,n-1); //for(int i = 0 ; i < n ; i ++) // printf("%d ",a[i]); // puts(""); delete b; return true; } void swap(int &a,int &b){ int temp; temp = a;a = b; b = temp; } int partition(int a[],int l,int r){ int m = ((r - l) >> 1) + l; swap(a[m],a[r]); int x = a[r]; int i = l - 1; for(int j = l ; j < r ; j ++){ if(a[j] < x){ i ++; swap(a[i],a[j]); } } swap(a[i+1],a[r]); return i + 1; } void qsort(int a[],int l,int r){ if(l < r){ int q = partition(a,l,r); qsort(a,l,q-1); qsort(a,q+1,r); } } void qsort_recursive(int a[],int l,int r){ stack<int> st1; stack<int> st2; st1.push(l); st2.push(r); while(!st1.empty() && !st2.empty()){ int tleft = st1.top(); int tright = st2.top(); st1.pop(),st2.pop(); if(tleft >= tright) continue; int q = partition(a,tleft,tright); st1.push(tleft);st1.push(q+1); st2.push(q-1);st2.push(tright); } } void bubblesort(int a[],int n){ bool flag = true; int k = n; while(flag){ flag = false; for(int j = 1; j < k ; j ++){ if(a[j - 1] > a[j]){ swap(a[j-1],a[j]); flag = true; } } k --; } } int random(int n){ double ran = (double)(rand()/(double)RAND_MAX); ran = ran * (n - 1) + 1.0; return (int)ran; } int main() { srand((int)time(0)); double ans; for(int n = 100 ; n <= 10000000 ; n *=10){ int *a = new int ; for(int i = 0 ; i < n ; i ++) a[i] = random(n*10); clock_t start,finish; start = clock(); bool res = MergeSort1(a,n); finish = clock(); ans = (double)(finish - start) / CLOCKS_PER_SEC; printf("数据量为%d时:\n",n); printf("递归归并排序耗时:%.1fms\n",ans*1000); for(int i = 0 ; i < n ; i ++) a[i] = random(n*10); start = clock(); mergesort_unrecursive(a,n); finish = clock(); ans = (double)(finish - start) / CLOCKS_PER_SEC; printf("非递归归并排序耗时:%.1fms\n",ans*1000); for(int i = 0 ; i < n ; i ++) a[i] = random(n*10); start = clock(); qsort(a,0,n-1); finish = clock(); ans = (double)(finish - start) / CLOCKS_PER_SEC; printf("递归快速排序耗时:%.1fms\n",ans*1000); for(int i = 0 ; i < n ; i ++) a[i] = random(n*10); start = clock(); qsort_recursive(a,0,n-1); finish = clock(); ans = (double)(finish - start) / CLOCKS_PER_SEC; printf("非递归快速排序耗时:%.1fms\n",ans*1000); for(int i = 0 ; i < n ; i ++) a[i] = random(n*10); start = clock(); //bubblesort(a,n); finish = clock(); ans = (double)(finish - start) / CLOCKS_PER_SEC; printf("冒泡排序耗时:%.1fms\n",ans*1000); printf("\n"); delete []a; } return 0; }
习惯了递归的实现方法,非递归的很有必要学学。
相关文章推荐
- 白话经典算法系列之五 归并排序的实现(讲的真好)(转载)
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- 【转载】白话经典算法系列之五 归并排序的实现
- 排序--选择排序,插入排序,冒泡排序,shell排序,快速排序(递归,迭代,改进版本),归并排序
- 归并排序的迭代及递归实现
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- [数据结构与算法]白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现(讲的真好)
- 【白话经典算法系列之五】 归并排序的实现
- 归并排序的递归和非递归实现
- 经典面试题:Java实现-归并K条已排序的链表及复杂度分析、优化
- 白话经典算法系列之五 归并排序的实现(改)
- 白话经典算法系列之五 归并排序的实现
- 二路归并非递归排序Java实现
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- 归并排序的非递归实现