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

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

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

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

源代码如下:

#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;
}

运行结果:

 

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值