各种排序方法

前一阵子为了准备暑期实习笔试、面试,把维基上查到的常用的排序算法全写了一遍。基本是按照算法导论和维基上面的思路写的,有些算法的细节可能和一些书上有出入,但是思想是一样的。cpp文件在最后,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<math.h>
#include<deque>
using namespace std;
#define SIZE  1000
#define MIN   -65536
#define  rm(x)  (x>>1)
#define  lm(x)  (x<<1)
//二分查找
int bi_search(int arr[],int value,int start,int end){
	if(start==end){
		if(arr[start]!=value)
			return -1;
		else
			return start;
	}
	if(start>end)
		return -1;
	else{
		if(arr[(start+end)/2]==value)
			return (start+end)/2;
		else if(arr[(start+end)/2]<value)
			bi_search(arr,value,(start+end)/2+1,end);
		else
			bi_search(arr,value,start,(start+end)/2-1);
	}
};
//冒泡排序,稳定
void buble_sort(int arr[],int size){
	int i,j;
	for(int i=0;i<size-1;i++){
		for(int j=size-1;j>i;j--){
			if(arr[j]<arr[j-1]){
				int temp=arr[j];
				arr[j]=arr[j-1];
				arr[j-1]=temp;
			}
		}
	}
};
//插入排序,稳定
void insert_sort(int arr[],int size){
	int i,j,temp;
	for(i=1;i<size;i++){
		temp=arr[i];
		for(j=i-1;j>=0;j--){
			if(temp<arr[j]){
				arr[j+1]=arr[j];
				arr[j]=temp;
			}
			else
				break;
		}
	}
};
//非标准插入排序,稳定
void insert_sort2(int arr[],int size){
	int i,j;
	for(i=1;i<size;i++){
		for(j=i-1;j>=0;j--){
			if(arr[j+1]<arr[j]){
				int temp=arr[j+1];
				arr[j+1]=arr[j];
				arr[j]=temp;
			}
			else
				break;
		}
	}
};
//合并排序,稳定
void merge_sort(int arr[],int size){
	if(size==1)
		return;
	else{
		merge_sort(arr,size/2);
		merge_sort(arr+(size/2),size-size/2);
	}
	int*temp=new int[size];
	int i=0,j=size/2,k=0;
	while(k!=size){
		if((arr[i]<arr[j]&&i!=size/2)||j==size)
			temp[k++]=arr[i++];
		else if((arr[i]>=arr[j]&&j!=size)||i==size/2)
			temp[k++]=arr[j++];
	}
	for(i=0;i<size;i++)
		arr[i]=temp[i];
	delete[] temp;
};
//桶排序,用哈希方法,输入必须是正数,稳定
void bucket_sort(int arr[],int size){
	int i,j,max=arr[0];
	for(i=1;i<size;i++){
		if(max<arr[i])
			max=arr[i];
	}
	int*hash=new int[max];
	memset(hash,0,sizeof(int)*max);
	for(i=0;i<size;i++)
		hash[arr[i]]++;
	i=0;j=0;
	while(j<size){
		if(hash[i]){
			arr[j++]=i;
			hash[i]--;
		}
		else
			i++;
	}
	delete[] hash;
};
//基数排序,稳定,输入必须是正数
void radix_sort(int arr[],int size){
	int max=MIN,num=1,i,j,k;
	deque<int> queue[10];
	for(i=0;i<size;i++){
		if(max<arr[i])
			max=arr[i];
	}
	while(max!=0)
		max=max-max%(int)pow((double)10,(double)num++);
	for(i=1;i<num;i++){
		for(j=0;j<size;j++){
			int id=arr[j];
			for(k=i;k>1;k--)
				id/=10;
			id%=10;
			queue[id].push_back(arr[j]);
		}
		for(j=0,k=0;j<10;j++){
			while(queue[j].size()!=0){
				arr[k++]=queue[j].front();
				queue[j].pop_front();
			}
		}
	}
};
//选择排序,不稳定
void select_sort(int arr[],int size){
	int i,j,min,value;
	for(i=0;i<size-1;i++){
		min=i;value=arr[min];
		for(j=i+1;j<size;j++){
			if(arr[j]<value){
				min=j;
				value=arr[j];
			}
		}
		arr[min]=arr[i];
		arr[i]=value;
	}
};
//堆排序,不稳定
//调整堆,使其保持为最大堆
void max_heapify(int heap[],int i,int size){
	int l=lm(i);
	int r=lm(i)+1;
	int largest;
	if(l<=size&&heap[i]<heap[l])
		largest=l;
	else
		largest=i;
	if(r<=size&&heap[largest]<heap[r])
		largest=r;
	if(largest!=i){
		int temp=heap[i];
		heap[i]=heap[largest];
		heap[largest]=temp;
		max_heapify(heap,largest,size);
	}
};
//重复调用max_heapify,建立最大堆
void build_max_heap(int heap[],int size){
	for(int i=size/2;i>=1;i--)
		max_heapify(heap,i,size);
};
void heap_sort(int heap[],int size){
	build_max_heap(heap,size);
	for(int i=size;i>=2;i--){
		int temp=heap[1];
		heap[1]=heap[i];
		heap[i]=temp;
		size--;
		max_heapify(heap,1,size);
	}
};
//希尔排序,插入排序的加强版
void insert(int arr[],int size,int step){
	int i,j,temp;
	for(i=step;i<size;i++){
		temp=arr[i];
		for(j=i-step;j>=0;j-=step){
			if(temp<arr[j]){
				arr[j+step]=arr[j];
				arr[j]=temp;
			}
			else
				break;
		}
	}
};
void shell_sort(int arr[],int size){
	int step=size/2;
	while(step>0){
		insert(arr,size,step);
		step/=2;
	}
};
void partition(int arr[],int end){
	if(end<=0)
		return;
	int pivot=arr[end],left=-1,right=-1;
	for(int i=0;i<end;i++){
		if(arr[i]>pivot)
			right++;
		else{
			left++;
			right++;
			int temp=arr[right];
			arr[right]=arr[left];
			arr[left]=temp;
		}
	}
	arr[end]=arr[left+1];
	arr[left+1]=pivot;
	partition(arr,left);
	partition(arr+left+2,end-left-2);
};
void quick_sort(int arr[],int size){
	partition(arr,size-1);
};
int main(){
	int arr[SIZE],i=0,size,value=10;
	while(scanf("%d",&arr[i++])!=EOF){}
	size=i-1;
	//int result=bi_search(arr,value,0,size-1);
	//printf("%d\n",result);
	//buble_sort(arr,size);
	//insert_sort(arr,size);
	//merge_sort(arr,size);
	//radix_sort(arr,size);
	//select_sort(arr,size);
	//bucket_sort(arr,size);
	//heap_sort(arr,size);//从下标1开始
	//shell_sort(arr,size);
	//quick_sort(arr,size);
	return 0;
}

  CPP文件下载

posted @ 2013-05-13 21:08  handspeaker  阅读(475)  评论(0编辑  收藏  举报