C++ 排序算法

#include<vector>
#include<iostream>
using namespace std;

//从小到大排序 

//冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来 
void bubble_sort(vector<int> &nums){ //要传递的是引用 
	for(int i=0;i<nums.size();i++){
		for(int j=0;j<nums.size()-i-1;j++){
			if(nums[j]>nums[j+1]){
				swap(nums[j],nums[j+1]);   //C++的库中就有这个函数:swap(a,b) 
			} 
		}
	}
} 

//选择排序:和冒泡排序一样,也是要选着走一遍,但是不需要一直交换,最后放到相应的位置即可 
void select_sort(vector<int> &nums){
	if(nums.size()==0) return;
	for(int i=0;i<nums.size();i++){
		int min=i;
		for(int j=i+1;j<nums.size();j++){
			if(nums[j]<nums[min]){
				min=j;
			}
		}
		swap(nums[i],nums[min]);
	}
}

//插入排序
//将一个数插入到已经排好序的序列中
//从小到大排序 
void insert_sort(vector<int> &nums){
	if(nums.size()==0) return;
	for(int i=1;i<nums.size();i++){
		for(int j=i;j>0;j--){
			if(nums[j-1]>nums[j]){
				swap(nums[j-1],nums[j]);
			}
		}
	}
} 


//希尔排序
//也就是 分组插入排序 
void shell_sort(vector<int> &nums){
	if(nums.size()==0) return;
	for(int gap=nums.size()/2;gap>0;gap=gap/2){
		for(int i=gap;i<nums.size();i+=gap){   //插入排序 
			for(int j=i;j>0;j-=gap){
				if(nums[j-gap]>nums[j]){
					swap(nums[j-gap],nums[j]);
				}
			}
		}
	}
} 


//归并排序 分治的思想 
void msort(vector<int>& nums,int begin,int end){
	if(begin>=end) return;
	int mid=(begin+end)/2;
	msort(nums,begin,mid);
	msort(nums,mid+1,end);
	vector<int> temp; 
	int i,j;
	for(i=begin,j=mid+1;i<=mid&&j<=end;){
		if(nums[i]<nums[j]){ 
			temp.push_back(nums[i]);
			i++; 
		} 
		else{
			temp.push_back(nums[j]);
			j++;
		}
	} 
	while(i<=mid){
		temp.push_back(nums[i]);
		++i;
	}
	while(j<=end){
		temp.push_back(nums[j]);
		++j;
	}
	for(int k=0,l=begin;k<temp.size();k++,l++){
		nums[l]=temp[k];
	}
}

void merge_sort(vector<int> &nums){
	msort(nums,0,nums.size()-1);
}


//快速排序
//对冒泡排序的改进 
//通过一趟排序将要排序的数据分割成独立的两部分,\
其中一部分的所有数据都比另外一部分的所有数据都要小,\
然后再按此方法对这两部分数据分别进行快速排序,整个排序过\
程可以递归进行,以此达到整个数据变成有序序列。
int partation(vector<int> &nums,int begin,int end){
	int low=begin;
	int high=end;
	int temp=nums[low];
	while(low<high){
		while(low<high&&nums[high]>=temp){
			high--;
		}
		nums[low]=nums[high];
		while(low<high&&nums[low]<=temp){
			low++;
		}
		nums[high]=nums[low];
	}
	nums[high]=temp;  //跳出循环的时候high和low是一样的了 
	//cout<<high<<endl;
	return high;
} 

void qsort(vector<int> &nums,int begin,int end){
	if(begin<end){   //不要忘记设置跳出循环的条件 
		int p=partation(nums,begin,end);
		qsort(nums,begin,p);
		qsort(nums,p+1,end);
	}
}

void quick_sort(vector<int> &nums){
	qsort(nums,0,nums.size()-1);
}

//堆排序
//将树层序遍历,从0开始,编号为i的节点的子节点为2i+1,2i+2 
//升序建立大顶堆,降序建立小顶堆
void adjust(vector<int> &nums,int i,int length){  //调整堆 
	int temp=nums[i];
	for(int k=2*i+1;k<length;k=2*k+1){
		if(k+1<length&&nums[k]<nums[k+1]) k++;
		if(nums[k]>temp){  //temp是要挪动的数 
			nums[i]=nums[k];
			i=k;
		}else{
			break;
		}
	}
	nums[i]=temp;
} 
 
void heap_sort(vector<int> &nums){
	for(int i=nums.size()/2-1;i>=0;i--){
		adjust(nums,i,nums.size());
	}
	for(int j=nums.size()-1;j>0;j--){
		swap(nums[0],nums[j]);
		adjust(nums,0,j);
	}
} 


int main(){
	int a[10]={4,3,5,-1,8,10,45,2,5,67};
	vector<int> nums(a,a+10);   //可以这样初始化数组 

	//bubble_sort(nums);
	//select_sort(nums);
	//insert_sort(nums);
	//merge_sort(nums);
	//shell_sort(nums);
	//quick_sort(nums);
	heap_sort(nums);
	for(int i=0;i<10;i++){
		cout<<nums[i]<<endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值