实现冒泡排序的和快速排序的递归和非递归版——题集(十七)

来源:互联网 发布:python教程 廖雪峰 编辑:程序博客网 时间:2024/06/05 16:11

实现冒泡排序的和快速排序的递归和非递归版——题集(十七)

       今天分享一下实现冒泡排序快速排序的递归和非递归版本的源代码和测试用例。

       实现冒泡排序的源代码和运行示例。

源代码如下:

#include<iostream>using namespace std;//实现冒泡排序的void BubbleSort(int* aim, int size){//实现冒泡排序if(size <= 1) return;for(int i=0; i<size; i++){//int max=aim[0];bool flag=true; for(int j=1; j<size-i; j++){if(aim[j-1]>aim[j]){swap(aim[j-1], aim[j]);flag=false;}}if(flag) break;}}void PrintArr(int* aim, int size){//打印for(int i=0; i<size; i++){cout<<aim[i]<<" ";}cout<<endl;}void TestBS(){///实现冒泡排序cout<<"实现冒泡排序"<<endl<<endl;int tmp[]={49,38,65,97,76,13,27,49,55,4};int len=sizeof(tmp)/sizeof(tmp[0]);cout<<"打印原数组: ";PrintArr( tmp, len);cout<<endl;BubbleSort(tmp, len);//实现冒泡排序cout<<"打印冒泡排序后的数组: ";PrintArr( tmp, len);cout<<endl<<endl;}int main(){TestBS();///实现冒泡排序system("pause");return 0;}

运行结果:

 

       实现快速排序的递归的源代码和运行示例。

       说明:每次选到的KEY值都是当前最大或最小时,快速排序最坏。可利用三数取中法来避免最坏情况的出现。且快速排序的时间复杂度是O(n*log2n)。

源代码如下:

#include<iostream>using namespace std;//快速排序的递归void _FastSort(int* aim,int begin, int end){//if(begin<0)return;if(begin >= end) return;int left=begin+1;int right=end-1;int val=aim[begin];int cur=begin;while(left<= right){while(left<= right && val<aim[right]){--right;}if(left> right) break;aim[cur]=aim[right];cur=right;right--;while(left<= right && val>aim[left]){++left;}if(left> right) break;aim[cur]=aim[left];cur=left;left++;}if(cur!=begin) aim[cur]=val;_FastSort(aim,begin, cur);_FastSort(aim,cur+1, end);}void FastSort(int* aim, int size){//挖坑法-快速排序if(size<=1) return;_FastSort(aim,0, size);}void PrintArr(int* aim, int size){//打印for(int i=0; i<size; i++){cout<<aim[i]<<" ";}cout<<endl;}void TestFS(){///实现快速排序-递归cout<<"实现快速排序(递归)"<<endl<<endl;//int tmp[]={4,2,1,7,3,8};int tmp[]={49,38,65,97,76,13,27,49,55,4};int len=sizeof(tmp)/sizeof(tmp[0]);cout<<"打印原数组: ";PrintArr( tmp, len);cout<<endl;FastSort(tmp, len);//挖坑法-快速排序cout<<"打印快速排序后的数组: ";PrintArr( tmp, len);cout<<endl<<endl;}int main(){TestFS();///实现快速排序system("pause");return 0;}

运行结果:

 

      实现快速排序的非递归的源代码和运行示例。——利用三数取中法进行了优化

源代码如下:

#include<iostream>using namespace std;#include<queue>//三数取中法int Mid(int* aim,int begin, int end){//三数取中法int mid=(begin+end)/2;if(aim[begin]>aim[end]){if(aim[end]>aim[mid]){return end;}else if(aim[begin]>aim[mid]){return mid;}else{return begin;}}else{//aim[begin]<=aim[end]if(aim[begin]>aim[mid]){return begin;}else if(aim[end]>aim[mid]){return mid;}else{return end;}}}//快速排序的非递归void FastSortNR(int* aim, int size){//挖坑法-快速排序if(size<=1) return;queue<int> tmp;tmp.push(0);tmp.push(size-1);//[]while(!tmp.empty()){int begin=tmp.front();tmp.pop();int end=tmp.front();tmp.pop();if(begin<0 || begin > end) continue;int mid=Mid(aim, begin, end);//三数取中法swap(aim[begin], aim[mid]);int left=begin+1;int right=end;int val=aim[begin];int cur=begin;while(left<= right){while(left<= right && val<aim[right]){--right;}if(left> right) break;aim[cur]=aim[right];cur=right;right--;while(left<= right && val>aim[left]){++left;}if(left> right) break;aim[cur]=aim[left];cur=left;left++;}if(cur!=begin) aim[cur]=val;tmp.push(begin);//左区间tmp.push(cur-1);//左区间tmp.push(cur+1);//右区间tmp.push(end);//右区间}}void PrintArr(int* aim, int size){//打印for(int i=0; i<size; i++){cout<<aim[i]<<" ";}cout<<endl;}void TestFSNR(){///实现快速排序-非递归cout<<"实现快速排序(非递归)"<<endl<<endl;//int tmp[]={4,2,1,7,3,8};int tmp[]={49,38,65,97,76,13,27,49,55,4};int len=sizeof(tmp)/sizeof(tmp[0]);cout<<"打印原数组: ";PrintArr( tmp, len);cout<<endl;FastSortNR(tmp, len);//挖坑法-快速排序—非递归cout<<"打印快速排序后的数组: ";PrintArr( tmp, len);cout<<endl<<endl;}int main(){TestFSNR();///实现快速排序-非递归system("pause");return 0;}

运行结果:

 

       分享如上,如有错误,望斧正!愿大家学得开心,共同进步!

原创粉丝点击