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