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

浙公网安备 33010602011771号