冒泡排序,选择排序,插入排序(简单排序大礼包)

这三种排序可以作为是算法入门的基础,三者的时间复杂度都是o(n^2),建议初学者试着独自实现这些算法,下面的OJ题可以测试你的算法是否是正确的:排序测试。以下所有的代码均通过该测试

冒泡排序

这个是在初学C语言时就接触的算法,思路就是遍历整个序列,依次比较两个相邻元素之间的大小,根据大小关系再决定是否调换,至多经过n次遍历即可得到一个有序序列。

#include<iostream>
using namespace std;

/*冒泡排序从第一个元素开始,依次将相邻元素比较,若满足条件,则位置不变,若不满足则交换位置,直到整个序列有序*/
int array[100];
void Show(int *array,int Tcase);		//输出当前数组内的元素 
bool comp(int a,int b);					//判断标准 
bool Adjust(int *array,int Tcase,bool(*comp)(int a,int b));		//对该数组进行一趟冒泡排序            
                                       //的调整,如果中途没有发生交换,返回true否则返回false 

int main(){
	int i,Tcase;
	cin>>Tcase;				//先输入测试的数据个数
	for(i=0;i<Tcase;++i) {
		cin>>array[i];		//依次输入当前的值 
	}
	i=1;
	while(Adjust(array,Tcase,comp)==0){

	}
	Show(array,Tcase);
	return 0;
}


void Show(int *array,int Tcase){
//输出当前数组内的元素 
	int i;
	for(i=0;i<Tcase;++i) {
		cout<<array[i]<<" ";		
	}
}	

bool Adjust(int *array,int Tcase,bool(*comp)(int a,int b)){
	int i,temp,flag=1;
	for(i=0;i<Tcase-1;++i){
		if(comp(array[i],array[i+1])){
			temp=array[i];
			array[i]=array[i+1];
			array[i+1]=temp;
			flag=0;
		}
	}
	if(flag==1){
		return true;
	}
	else{
		return false;
	}
}

bool comp(int a,int b){
	return a>b;
}	

选择排序

初始的序列可以分为两个集合,有序序列和无序序列,其中初始有序序列为空集。在初始的无序序列中,选择当前最大(最小)的元素,加入有序序列的末尾中,直到有序序列为空为止。

/*
	Name: 
	Description: 选择排序 
*/

#include<iostream>
using namespace std;


void swap(int a[],int m,int n);		//交换数组a中下标为a和b的值 
void Selectsort(int a[],int start,int end);	//对数组a中的下标a[start]到a[end]进行选择排序 
int FindTarget(int a[],int start,int end);	//找到数组start到end之中满足条件的极值的下标 
bool comp(int a,int b) {
	return a>b;
}
int main() {
	int N;
	cin>>N;
	int a[N];
	for(int i=0; i<N; ++i) {
		cin>>a[i];
	}
	Selectsort(a,0,N-1);
	for(int i=0; i<N; ++i) {
		cout<<a[i]<<" ";
	}
	return 0;
}

void Selectsort(int a[],int start,int end){
	for(int i=start;i<=end;i++){
		int T=FindTarget(a,i,end);
		swap(a,i,T);
	}
}

void swap(int a[],int m,int n){
	int temp=a[m];
	a[m]=a[n];
	a[n]=temp;
}

int FindTarget(int a[],int start,int end){
	int T=start;
	for(int i=start;i<=end;++i) {
		if(comp(a[T],a[i])){
			T=i;
		}
	}
	return T;
}

插入排序

和选择排序类似,可以将序列初始分为有序的空集和无序的全集。不同的是,我们顺序取得无序集的元素,然后在有序集中,找到它所在的位置,然后将所选元素插入其位置。


#include<iostream>
using namespace std;

/*插入排序从第i个元素开始,然后在前i-1个位置中,找到合适的地方后插,直到整个序列有序*/
int array[100];
void Show(int *array,int Tcase);		//输出当前数组内的元素
bool comp(int a,int b);					//判断标准
void Adjust(int *array,int Tcase,int i,bool(*comp)(int a,int b));	//对该数组的第i个元素进                                                    
                                                              //行一趟选择排序的操作

int main() {
	int i,Tcase;
	cin>>Tcase;				//先输入测试的数据个数
	for(i=0; i<Tcase; ++i) {
		cin>>array[i];		//依次输入当前的值
	}

	for(i=0; i<Tcase; ++i) {
		Adjust(array,Tcase,i,comp);
//		printf("第%d躺排序: ",i+1);
	}
	Show(array,Tcase);
	return 0;
}


void Show(int *array,int Tcase) {
//输出当前数组内的元素
	int i;
	for(i=0; i<Tcase; ++i) {
		cout<<array[i]<<" ";
	}
}

void Adjust(int *array,int Tcase,int i,bool(*comp)(int a,int b)) {
	int temp=array[i];
	int k,j;
	for(k=0; k<i; ++k) {
		if(comp(array[i],array[k])) {
			for(j=i-1; j>=k; --j) {				//将k位置之后的元素全部右移
				array[j+1]=array[j];
			}
			array[k]=temp;
			return;
		}
		/*	if(k==0){
				for(j=i-1;j>=0;--j){				//将k位置之后的元素全部右移
					array[j+1]=array[j];
				}
				array[k]=temp;
				return;
			}			*/
	}
}

bool comp(int a,int b) {
	if(a<b) {
		return true;
	} else {
		return false;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值