算法导论第四章-快速排序

来源:互联网 发布:iscroll.js中文官网 编辑:程序博客网 时间:2024/06/03 09:26
//快速排序复杂度为O(nlogn),平均复杂度也是O(nlogn),所以就平均时间而言,被认为是最好的一种排序方法#include<iostream>using namespace std;//以a[low]为枢轴,小于它的都放到a[low]前面,大于它的都放到后面,则low的位置即确定int quick_sort(int *a,int low,int high){int tmp=a[low];int i=low;int j=high;while(i<j){//从后开始遍历,直到找到比枢轴小的while(i<j&&a[j]>=tmp)j--;//找到之后把它放到前面if(i<j){a[i]=a[j];i++;}//再从i开始向后遍历,直到找到比枢轴大的while(i<j&&a[i]<=tmp)i++;//找到之后把发放到j处if(i<j){a[j]=a[i];j--;}}//确定i的位置a[i]=tmp;return i;}//递归排序void sort(int *a,int low,int high){if(low<high){int i=quick_sort(a,low,high);sort(a,low,i);sort(a,i+1,high);}}int main(){int a[ ]={2,1,3,4,7,5,8,6,0,9};int length=sizeof(a)/sizeof(*a);cout<<"原数组为:          ";for(int i=0;i<length;i++)cout<<a[i]<<" ";cout<<endl;sort(a,0,length-1);cout<<"快速排序后的数组为:";for(int i=0;i<length;i++)cout<<a[i]<<" ";cout<<endl;return 0;}

算法导论书上的方法:

#include <iostream>#include <vector>using namespace std;//注意begin和end 为下标,以第一个数begin为枢轴void quick_sort(vector<int> &data , int begin , int end){if(data.empty() || begin >= end)return ;int j = begin ;for(int i = begin + 1; i <= end ; i++){if(data[i] < data[begin]){ j++;swap(data[i] , data[j]);}}swap(data[j] , data[begin]);quick_sort(data , begin , j - 1);quick_sort(data , j + 1 , end);}int main(){int num[] = {2,4,1,6,8,3,0,5};int len = sizeof(num) / sizeof(*num);vector<int> data(num , num + len);//注意data的初始化方式quick_sort(data , 0 , len - 1);for(int i = 0 ; i < len ; i++){cout<<data[i]<<" ";}cout<<endl;}



0 0