八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合:

/************************************************************************* 
        > Copyright (c)2014  stay hungry,stay foolish !!!  
        > File Name: sort.cpp 
        > Author: kanty 
        > Mail: [email protected]  
        > Created Time: 2014年03月23日 星期日 10时14分20秒 
        > Question Description:  
 ************************************************************************/  
  
#include<iostream>  
using namespace std;  
  
void bubble_sort(int *a,int m)  
{  
    int i,j,temp;  
    for(i=0;i<m-1;i++)//确定比较趟数  
    for(j=0;j<m-1-i;j++)//两两比较  
    if(a[j]>a[j+1])//小的上浮,大的下沉  
    {  
        temp=a[j];  
        a[j]=a[j+1];  
        a[j+1]=temp;  
    }  
}  
void bubble_sort1(int *a,int m)  
{  
    int i,j,temp;  
     bool flag=true;  
     for(i=0;i<m-1&& flag;i++)  
     {  
      flag=false;  
      for(j=0;j<m-1-i;j++)  
      if(a[j]>a[j+1])  
       {//如果本趟不发生交换,说明该序列已经是有序序列了  
        //flag一直为false就不再进行循环了,已经是有序了  
         temp=a[j];  
          a[j]=a[j+1];  
        a[j+1]=temp;  
        flag=true;  
     }  
   }  
}  
void select_sort(int *a,int m)  
{  
    int i,j,k,temp;  
    for(i=0;i<m-1;i++)//比较趟数  
    {  
        k=i;//保存下标  
        for(j=i+1;j<m;j++)  
        if(a[k]>a[j])//将i之后的元素与i对应的元素进行比较,  
        //如果后面的元素小于i对应的元素,则交换下标  
        k=j;  
        if(k!=i)//如果下标不相等就交换对应的元素  
        {  
            temp=a[k];  
            a[k]=a[i];  
            a[i]=temp;  
        }  
    }  
}  
  
int division(int *a,int left,int right)  
{  
    int base=a[left];//定基准  
    while(left<right)  
    {  
        while(left<right && base<a[right])//将最右边的元素与基准进行比较  
        right--;  
        a[left]=a[right];  
        while(left<right && base>a[left])//将最左边的元素与基准进行比较  
        left++;  
        a[right]=a[left];  
    }  
    a[left]=base;  
    return left;//返回中间的基准下标  
}  
void quick_sort(int *a,int left,int right)  
{  
    if(left<right)  
    {  
        int mid=division(a,left,right);//先进行分割  
        quick_sort(a,left,mid-1);//左递归排序  
        quick_sort(a,mid+1,right);//右递归排序  
    }  
}  
  
void insert_sort(int *a,int m)  
{//此为直接插入排序算法  
  int i,j,temp;  
    for(i=1;i<m;i++)  
    {  
        temp=a[i];  
        for(j=i-1;j>=0&&temp<a[j];j--)//循环并进行判断,如果后面的元素小于前边的元素,元素依次向右移位  
        a[j+1]=a[j];  
        a[j+1]=temp;  
    }  
}  
  
void shell_sort(int *a,int m)  
{  
    int i,j,temp,gap;  
    for(gap=m/2;gap>0;gap/=2)//进行间隔递增  
    {  
        for(i=gap;i<m;i++)//从gap开始向后循环  
        {  
            temp=a[i];  
            for(j=i-gap;j>=0&&temp<a[j];j-=gap)//和直接插入排序一样,只是间隔变大而已  
            a[j+gap]=a[j];  
            a[j+gap]=temp;  
        }  
    }  
}  
void b_sort(int *a,int m)  
{//此法是折半排序  
    int i,j,low,mid,high,temp;  
    for(i=1;i<m;i++)  
    {  
        temp=a[i];  
        low=0;  
        high=i-1;  
        while(low<=high)  
        {  
            mid=(low+high)/2;//折半  
            if(temp<a[mid])//判断要插入的位置范围,并缩小插入的位置  
            high=mid-1;  
            else  
            low=mid+1;  
        }  
        for(j=i;j>low;j--)//注意最小为low,有低位向高位移动  
        a[j]=a[j-1];  
        a[low]=temp;  
    }  
}  
  
void merge_step(int *a,int *b,int start,int mid,int end)  
{  
    int i,j,k,temp;  
    i=start;  
    j=mid+1;//将待排序数组分为前后两部分  
    k=0;  
    while(i<=mid && j<=end)//判断前后两部分是否到达边界  
    {  
        if(a[i]<a[j])//比较前后两部分的元素的大小  
        b[k++]=a[i++];//将小的赋值给数组b,并依次后移下标  
        else  
        b[k++]=a[j++];  
    }  
    while(i<=mid)//对于未到达边界的直接赋值给b数组  
    b[k++]=a[i++];  
    while(j<=end)  
    b[k++]=a[j++];  
    for(i=0;i<k;i++)  
    a[start+i]=b[i];//将b数组中排好序的元素重新赋值给a,注意加上start,start为起始边界  
}  
void merge(int *a,int *b,int start,int end)  
{  
    if(start<end)  
    {  
        int mid=(start+end)/2;//折半  
        merge(a,b,start,mid);//左递归依次分割更小的部分  
        merge(a,b,mid+1,end);//右递归依次分割更小的部分  
        merge_step(a,b,start,mid,end);//调用排序算法,分别进行排序  
    }  
}  
void merge_sort(int *a,int m)  
{  
    int *b=new int[m*sizeof(int)];//开辟一个数组空间  
    merge(a,b,0,m-1);//排序算法调用  
    delete [] b;//释放开辟的空间  
    b=0;  
}  
  
void heap_adjust_down(int *a,int start,int end)  
{  
    int i,temp;  
    i=2*start+1;//左孩子节点的下标  
    temp=a[start];//保存首元素  
    while(i<=end)//判断堆是否到达结尾  
    {  
        if(i+1<=end && a[i+1]>a[i])//找出左右孩子中最大一个  
            i++;  
        if(a[i]<=temp)//如果为最大堆顺序就无需调整  
            break;  
        //最大的子节点上移,替换掉父节点  
        a[start]=a[i];  
        start=i;  
        i=2*start+1;  
    }  
    a[start]=temp;//将根节点插入到对应的位置  
}  
  
void heap_sort(int *a,int m)  
{  
    int i,temp;  
    for(i=(m-1)/2;i>=0;i--)  
    //第一个非叶子节点的下标(m-1)/2  
    //首先将数组建成最大二叉堆  
        heap_adjust_down(a,i,m-1);//进行堆排序  
    for(i=m-1;i>0;i--)  
    {//首先将堆顶元素与最后一个元素进行交换  
     //可以始终是数组的最后的一个元素保存为最大元素  
     //当交换后最后一个元素就保存为最大值  
     //对余下的元素重新进行最大堆排序,通过排序将最大值放在数组第一个元素中  
        temp=a[i];  
        a[i]=a[0];  
        a[0]=temp;  
        heap_adjust_down(a,0,i-1);  
    }  
}  
void choose_sort(int *array,int n)  
{  
    cout<<"             please look at the sort algorithm:  "<<endl<<endl;  
    cout<<"*************************     sort      ************************"<<endl;  
    cout<<"***************   1   冒泡排序 bubble_sort     ****************"<<endl;  
    cout<<"***************   2   选择排序 select_sort     ****************"<<endl;  
    cout<<"***************   3   快速排序 quick_sort      ****************"<<endl;  
    cout<<"***************   4   直接插入排序 insert_sort ****************"<<endl;  
    cout<<"***************   5   希尔排序  shell_sort     ****************"<<endl;  
    cout<<"***************   6   折半排序  b_sort         ****************"<<endl;  
    cout<<"***************   7   归并排序  merge_sort     ****************"<<endl;  
    cout<<"***************   8   堆排序    heap_sort      ****************"<<endl;  
    cout<<"***************   9   冒泡排序 bubble_sort1     ****************"<<endl;  
    cout<<"***************   10 退出选择     ****************"<<endl;    
    cout<<"************************************************************"<<endl<<endl;  
 int k;   
cout<<"please input the number of sort algorithm: ";   
cin>>k;   
switch(k)   
{   
case 1 : bubble_sort(array,n);break;   
case 2 : select_sort(array,n);break;  
case 3 : quick_sort(array,0,n-1);break;   
case 4 : insert_sort(array,n);break;   
case 5 : shell_sort(array,n);break;   
case 6 : b_sort(array,n);break;   
case 7 : merge_sort(array,n);break;   
case 8 : heap_sort(array,n);break;     
case 9 : bubble_sort1(array,n);break;  
case 10 : break;   
default : break;   
}   
}  
int main()  
{   
int n;   
cout<<"please input a number of n : ";   
cin>>n;   
int *array=new int[n*sizeof(int)];   
cout<<endl<<"please input a array :"<<endl;   
for(int i=0;i<n;i++)  
 cin>>array[i];  
 cout<<endl<<" before sorted "<<endl;  
 for(int i=0;i<n;i++)  
 cout<<array[i]<<" ";   
cout<<endl<<endl;   
choose_sort(array,n);//进行排序算法的选择   
cout<<endl<<" after sorted "<<endl;  
 for(int i=0;i<n;i++)   
cout<<array[i]<<" ";   
delete [] array;   
array=0;   
return 0;  
} 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。