zoukankan      html  css  js  c++  java
  • 各种排序方法

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

  • 相关阅读:
    Java Web学习总结(9)——servlet和Jsp生命周期解读
    Java Web学习总结(9)——servlet和Jsp生命周期解读
    Java Web学习总结(10)——Session详解
    Java Web学习总结(10)——Session详解
    Mysql学习总结(6)——MySql之ALTER命令用法详细解读
    Mysql学习总结(6)——MySql之ALTER命令用法详细解读
    十大热门问题集锦,一眼看懂华为云数据库黑科技
    python上下文管理器细读
    关于token你需要知道的
    使用app测试Modelarts在线服务
  • 原文地址:https://www.cnblogs.com/hrlnw/p/3076481.html
Copyright © 2011-2022 走看看