各种排序算法(1)——冒泡,插入,选择,希尔,快排

自己抽时间总结并写了一下基本排序算法的实现。
#include <iostream>
#include <vector>
using namespace std;
//冒泡排序
void bubbleSort(int *a,int length){
	if(a==NULL || length==0)
		cout<<"illegal"<<endl;
	int flag;
	int i;
	for( i=length-1;i>0;i--){           //需要n-1次排序
		flag=0;       //为交换标记
		for(int j=0;j<i;j++){
			if(a[j]>a[j+1]){
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				flag=1;  //has swaped
			}
		}
		if(!flag){
			cout<<i<<endl; //测试第几次就完成了排序,很可能会小于n-1次
			break;
		}
	}
}
//选择排序
void selectSort(int *a,int length){
	if(a==NULL || length==0)
		cout<<"illegal"<<endl;
	for(int i=0;i<length;i++)
		for(int j=i+1;j<length;j++){
			if(a[i]>a[j]){
				int temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
}
//插入排序
void insertSort(int *a,int length){
	if(a==NULL || length==0)
		cout<<"illegal"<<endl;
	for(int i=1;i<length;i++)
		for(int j=i;(j>0)&&(a[j]<a[j-1]);j--){
			int temp=a[j];
			a[j]=a[j-1];
			a[j-1]=temp;
		}
}
//快排中找到分界点
int partition(int *a,int i,int j){
	int pivot=a[i];
	while(i<j){
		while(a[j]>=pivot && i<j)
			j--;
		if(i<j)
			a[i++]=a[j];    //不用吧a[i]赋给a[j]因为后面a[j]的值会被覆盖
		
		while(a[i]<pivot && i<j)
			i++;
		if(i<j)
		a[j--]=a[i];
		
	}
	a[i]=pivot;
	return i;
}
//快排
void quickSort(int *a,int low,int high){
	if(high-low<=0)
		return;
	int pivotpos;
	pivotpos=partition(a,low,high);
	quickSort(a,low,pivotpos-1);
	quickSort(a,pivotpos+1,high);
}
//希尔排序
void shellSort(int *a,int len)
{
	int d=len;
	int i;
	while(d>1)
	{
		d=(d+1)/2;
		for(i=0;i<len-d;i++)
		{
	
			for(int j=i;(j>=0) && (a[j+d]<a[j]);j--) //根据代码很容易看出,这其实是个改良的插入排序,就是多了间距d
			{
		
				int tmp=a[j+d];
				a[j+d]=a[j];
				a[j]=tmp;
			}
		}
		for(i=0;i<len;i++)
			cout<<a[i]<<" ";
		cout<<endl;
	}
}

int main(){
	int len;
	int input[50];
	cin>>len;
	for(int i=0;i<len;i++)
		cin>>input[i];
//	quickSort(input,0,len-1);
	//shellSort(input,len);
	for(int j=0;j<len;j++)
		cout<<input[j]<<" ";
	return 0;
}
有不对的地方,望指出,同学习,同进步。

你可能感兴趣的:(冒泡排序,希尔排序,插入排序,快速排序,排序算法)