­

C++实现常见的排序算法

这篇博客主要是对常见的排序算法做一总结如下:

快速排序

平均时间复杂度为:O(nlogn);空间复杂度为O(nlogn)。不稳定排序。n大的时候,性能更加优越。

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;


//划分的过程,因为快排是分治思想的,所以需要划分。
int partition(vector<int> & vec,int start,int end){
	int point=vec[start];
	int i=start;
	int j=end;

	while(i<j){
		while(i<j && vec[j]>=point) j--;
		vec[i]=vec[j];
		while(i<j && vec[i]<point) i++;
		vec[j]=vec[i];
	}	
	vec[i]=point;
	return i;
}

//快排的结构
void quick_sort(vector<int> &vec,int start,int end){
	if(start>end) return;
	int j=partition(vec,start,end);
	quick_sort(vec,start,j-1);
	quick_sort(vec,j+1,end);
}




int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	quick_sort(vec,0,n-1);

	for(int i=0;i<n;i++){
		printf("%d ",vec[i]);
	}
	return 0;
}

冒泡排序

**平均时间复杂度为:O(n^2);空间复杂度为O(1)。**稳定排序。

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;


void bubble_sort(vector<int>  &vec){
	int size=vec.size();

	for(int i=0;i<size-1;i++){//这一轮循环是要比较的元素,也就睡还没有排好序的元素,最初有n个,但是其实只要比较n-1个元素就可以,因为最后一个元素不用比较。
		for(int j=0;j<size-i-1;j++){
			if(vec[j]>vec[j+1]) swap(vec[j],vec[j+1]);
		}
	}

}


int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	bubble_sort(vec);

	for(int i=0;i<n;i++){
		cout<<vec[i]<<" ";
	}
	return 0;
}

归并排序

平均时间复杂度为:O(nlogn);空间复杂度为O(nlogn)。稳定排序。n大的时候,性能更加优越。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;


void merge(vector<int> & vec,int low,int mid,int high){
	vector<int> temp(high-low+1,0);
	int left_low=low;
	int left_high=mid;
	int right_low=mid+1;
	int right_high=high;

	int i=0;
	for(i=0;left_low<=left_high && right_low<=right_high;i++){
		if(vec[left_low]<=vec[right_low]){
			temp[i]=vec[left_low];
			left_low++;
		}
		else{
			temp[i]=vec[right_low];
			right_low++;
		}
	}

	if(left_low<=left_high){
		while(left_low<=left_high){
			temp[i]=vec[left_low];
			i++;
			left_low++;
		}
	}

	if(right_low<=right_high){
		while(right_low<=right_high){
			temp[i]=vec[right_low];
			i++;
			right_low++;
		}
	}

	for(int j=0;j<(high-low+1);j++){
		vec[low+j]=temp[j];
	}

	return ;
}


void merge_sort(vector<int> &vec,int start,int end){
	if(start>=end) return;
	int mid=start+(end-start)/2;
	merge_sort(vec,start,mid);
	merge_sort(vec,mid+1,end);
	merge(vec,start,mid,end);

	return;
}

int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	merge_sort(vec,0,n-1);

	for(int i=0;i<n;i++){
		printf("%d ",vec[i]);
	}
	return 0;
}

堆排序

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace  std;

//要建成最小堆,首先是要建成最大堆,然后调整为最小堆!
//调整成最大堆
void adjust_heap(vector<int> &vec,int size,int index){
	int left=2*index+1;
	int right=2*index+2;

	int max_index=index;
	if(left<size && vec[left]>vec[max_index]) max_index=left;
	if(right<size && vec[right]>vec[max_index]) max_index=right;


	if(max_index!=index){
		swap(vec[max_index],vec[index]);
		adjust_heap(vec,size,max_index);
	}
}

void heap_sort(vector<int> &vec,int size){
  //建立堆
	for(int i=size/2-1;i>=0;i--){
		adjust_heap(vec,size,i);
	}

  	//调整为最小堆
	for(int i=size-1;i>=1;i--){
		swap(vec[0],vec[i]);
		adjust_heap(vec,i,0);
	}
}

int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	heap_sort(vec,vec.size());

	for(int i=0;i<n;i++){
		printf("%d ",vec[i]);
	}
	return 0;
}

计数排序

平均时间复杂度为:O(n+k);空间复杂度为O(n+k)。稳定排序,其中,k表示序列中最大值。所以,计数排序使用与最大值不是很大的序列。

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

void count_sort(vector<int> & vec){
	if(vec.size()==0) return ;

	int maxvalue=0,minvalue=0;
	for(int i=0;i<vec.size();i++){
		maxvalue=max(maxvalue,vec[i]);
		minvalue=min(minvalue,vec[i]);
	}

	int range=maxvalue-minvalue+1;
	vector<int> temp(range,0);

	for(int i=0;i<vec.size();i++){
		temp[vec[i]-minvalue]+=1;
	}

	int j=0;
	for(int i=0;i<range;i++){
		while(temp[i]!=0){
			vec[j]=i+minvalue;
			temp[i]--;
			j++;
		}
	}

}


int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	count_sort(vec);

	for(int i=0;i<n;i++){
		printf("%d ",vec[i]);
	}
	return 0;
}

选择排序

平均时间复杂度为:O(n^2);空间复杂度为O(1)。**不稳定排序。

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

//选择排序与冒泡排序非常的类似,选择排序是选择一个最小的放在序列前面,而冒泡排序是选择一个最大的元素放在序列后面。
void select_sort(vector<int> &vec){
	int i=0;
	for(i=0;i<vec.size()-1;i++){//同样,只用比较n-1个元素
		for(int j=i+1;j<vec.size();j++){
			if(vec[j]<vec[i]) swap(vec[j],vec[i]);
		}
	}
}

int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	select_sort(vec);

	for(int i=0;i<n;i++){
		printf("%d ",vec[i]);
	}
	return 0;
}

插入排序

平均时间复杂度为:O(n^2);空间复杂度为O(1)。**稳定排序。

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

void insert_sort(vector<int> &vec){
	if(vec.size()==0) return;

	for(int i=1;i<vec.size();i++){
		int temp=vec[i];
		int j=i;
		while(j>0 && temp<vec[j-1]){
			vec[j]=vec[j-1];
			j--;
		}

		vec[j]=temp;
	}
}

int main(){
	int n;
	scanf("%d",&n);
	vector<int > vec;
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		vec.push_back(x);
	}

	insert_sort(vec);

	for(int i=0;i<n;i++){
		printf("%d ",vec[i]);
	}
	return 0;
}

各大算法时间与空间复杂度对比

image.png

Tags: