各种排序方法

前一阵子为了准备暑期实习笔试、面试,把维基上查到的常用的排序算法全写了一遍。基本是按照算法导论和维基上面的思路写的,有些算法的细节可能和一些书上有出入,但是思想是一样的。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文件下载

你可能感兴趣的:(排序)