排序算法

1.插入排序

//插入排序
void f(vector<int> &a){
	int i,j;
	for(i=1;i<a.size();++i){
		int temp=a[i];
		for(j=i;j>0;j--)
			if(a[j-1]>temp)//如果前面的数值大于temp,则后移。
				a[j]=a[j-1];
			else
				break;//跳出
		a[j]=temp;//将temp插入合适的位置
	
	}
}


2.冒泡排序

//冒泡排序
//1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

//2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

//3.N=N-1,如果N不为0就重复前面二步,否则排序完成
void bubble_sort(vector<int> &a){
	int l=a.size();
	if(l<2)
		return;
	int i,j;
	for(i=0;i<l;++i){
		for(j=1;j<l-i;++j){//l-i(每次内循环后都将每次的最大值放在l-i-1的位置上)
			if(a[j]<a[j-1]){//相邻元素比较,交换冒泡
			 int temp=a[j];
			 a[j]=a[j-1];
			 a[j-1]=temp;
			}
		}

	}

}


3.选择排序

//选择排序

void selectSort(vector<int> &a){
	int l=a.size();
	if(l<2)
		return;
	int i,j,d;
	for(i=0;i<l;++i){
		d=i;
		for(j=i+1;j<l;++j){
			if(a[i]>a[j])
              d=j;//记录每次内循环的最小值的位置
		}
		int temp=a[d];
	    a[d]=a[i];
	    a[i]=temp;
	}

}


4.归并排序

//归并排序
void mergesort(vector<int> &a, vector<int> &temp, int left, int right){
	void merge(vector<int> &a, vector<int> &temp, int leftbegin, int rightbegin, int rightend);
	if(left<right){
	    int center=(left+right)>>1;
		mergesort(a, temp, left, center);
		mergesort(a, temp, center+1, right);//先对两半各自排序,再把两半合并
		merge(a, temp, left, center+1, right);
	}
}
void merge(vector<int> &a, vector<int> &temp, int leftbegin, int rightbegin, int rightend){
	int leftend=rightbegin-1;
	int i=leftbegin,j=rightbegin,k=leftbegin;
	while(i<=leftend && j<=rightend)
		if(a[i]<=a[j])
			temp[k++]=a[i++];
		else
			temp[k++]=a[j++];
	while(i<=leftend)
		temp[k++]=a[i++];
	while(j<=rightend)
		temp[k++]=a[j++];
	for(i=leftbegin;i<=rightend;++i)//临时数组中元素的位置和实际数组一一对应,依次拷贝回去
		a[i]=temp[i];


}

5.快速排序

void swap(int &a, int &b){
	int temp=a;
	a=b;
	b=temp;
}
int Median3(vector<int> &a, int left, int right){//三数中值分割法
	int center=(left+right)>>1;
	if(a[left]>a[center])
		swap(a[left], a[center]);
	if(a[left]>a[right])
		swap(a[right], a[left]);//a[left]最小
	if(a[center]>a[right])
		swap(a[right], a[center]);//a[left]<=a[center]<=a[right]
	swap(a[center], a[right-1]);
	return a[right-1];//将中值放在倒数第二个位置
}
void sort(vector<int> &a, int left, int right){//当元素的个数等于3时,直接排序
	int center=(left+right)>>1;
	if(a[left]>a[center])
		swap(a[left], a[center]);
	if(a[left]>a[right])
		swap(a[right], a[left]);//a[left]最小
	if(a[center]>a[right])
		swap(a[right], a[center]);

}
void qsort(vector<int> &a, int left, int right){
	if(left+3<=right){//数组元素的个数大于3时,至少为4
	int temp=Median3(a, left, right);
	int i=left, j=right-2;
	while(i<j){
		while(a[i]<temp)
			++i;
		while(a[j]>temp)
			--j;
		swap(a[i],a[j]);

	}		
	swap(a[i],a[right-1]);//将中值放回合适的位置,作为分割点
	qsort(a, left, i-1);
	qsort(a, i+1, right);
	}
	else
		sort(a, left, right);//可用插入排序
}


6.快速排序2

int partion(vector<int> &A, int low, int high) {  
        int pivotkey = A[low];  
        int temp;  
        while (low < high) {  
            while (low < high && A[high] >= pivotkey)  
                high--;  
            A[low] = A[high];  
            while (low < high && A[low] <= pivotkey)  
                low++;  
            A[high] = A[low];  
        }  
        A[low] = pivotkey;  
        return low;  
    }  
void qsort(vector<int> &a, int left, int right){
	if(a.size()==0 || left<0 || right>=a.size() || right<=left)
		return;
	int index= Partition(a,left,right);
	if(index>left)
		qsort(a,left,index-1);
	if(index<right)
		qsort(a,index+1,right);

}

7.堆排

void HeapAdjust(vector<int> &v,int i,int size){
	int max=i;
	if(i<=(size-1)/2){//非叶子节点
		if(2*i+1<size&&v[max]<v[2*i+1])//左子树2*i+1,数组是从0开始的
			max=2*i+1;
		if(2*i+2<size&&v[max]<v[2*i+2])//右子树2*i+2
			max=2*i+2;
		if(max!=i){
			swap(v[i],v[max]);
			HeapAdjust(v,max,size);//向下调整
		}
	
	}

}
void BuildHeap(vector<int> &v){
	for(int i=v.size()-1;i>=0;--i)
		HeapAdjust(v,i,v.size());
}

void HeapSort(vector<int> &v){
	BuildHeap(v);
	for(int i=v.size()-1;i>=0;--i){
		swap(v[0],v[i]);
		HeapAdjust(v,0,i);
	}

}


主函数

#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> b;
	b.push_back(1);
	b.push_back(5);
	b.push_back(3);
	b.push_back(7);
	b.push_back(6);
	//void qsort(vector<int> &a, int left, int right);
	//qsort(b,0,b.size()-1);
	//void bubble_sort(vector<int> &a);
	//bubble_sort(b);
	void selectSort(vector<int> &a);
	selectSort(b);
	//vector<int> temp(b.size());
	//for(int i=0;i<b.size();++i)
		//temp.push_back(b[i]);
	//void mergesort(vector<int> &a, vector<int> &temp, int left, int right);
	//mergesort(b,temp,0,b.size()-1);
	//void f(vector<int>&);
	//f(b);
	for(vector<int>::iterator pos=b.begin();pos!=b.end();pos++)
		cout<<*pos<<' ';
return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值