实现冒泡排序的和快速排序的递归和非递归版——题集(十七)
今天分享一下实现冒泡排序和快速排序的递归和非递归版本的源代码和测试用例。
实现冒泡排序的源代码和运行示例。
源代码如下:
#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;
}
运行结果:
分享如上,如有错误,望斧正!愿大家学得开心,共同进步!