常用排序算法简单实现

//
//常用的排序算法,简单实现 
//
/


#include <stdio.h>
#include <stdlib.h>
void InsertSort(int * data,int length);
void print_array(int * data,int length);
void bubble_sort(int * data,int length);
void shell_sort(int * data,int length,int *dk,int t);
void quick_sort(int * data,int length);
void select_sort(int * data,int length);
void merge_sort(int *source,int *dest,int s,int t);
void heap_sort(int * data,int length);
/
int main(void)
{
    
    int arr[10]={1,8,6,9,7,2,4,3,0,5};
    int dest[10];
  //  InsertSort(arr,10);
      int dk[1]={1};
   //  shell_sort(arr,10,dk,1);
  // bubble_sort(arr,10);
 // quick_sort(arr,10);
 //select_sort(arr,10);
 //heap_sort(arr,10);
      merge_sort(arr,dest,1,10);
      print_array(arr,10);
    
}
//
//归并排序 
//
/

void merge(int *source,int *dest,int i,int m,int n)
{
     int j=m+1,k=i;
     for(;j<=n && i<=m;++k)
     {
        if(source[i-1]<source[j-1]) 
        {
            dest[k-1]=source[i-1];
            i++;
        }
        else
        {
            dest[k-1]=source[j-1];
            j++;
        }
        
     }
     while(i<=m)
     {
          dest[k-1]=source[i-1];
          k++;
          i++;
          
     }
     while(j<=n)
     {
          dest[k-1]=source[j-1];
           k++;
          j++;
     }
     
}
void merge_sort(int *source,int *dest,int s,int t)
{
     if(s==t) dest[s-1]=source[s-1];
     else
     {
         int mid=(s+t)/2;
         merge_sort(source,dest,s,mid);
         merge_sort(source,dest,mid+1,t);
         merge(source,dest,s,mid,t);
     }
}
//
//堆排序 
//
/


void heap_adjust(int * data,int s,int m)
{
   int temp=data[s-1];
   for(int j=2*s;j<=m;j*=2)
   {
       if(j<m && data[j-1]<data[j]) ++j; 
       if(data[s-1]>data[j-1]) break;
       data[s-1]=data[j-1];
       s=j;
   }
   
   data[s-1]=temp;
}

void heap_sort(int * data,int length)
{
     int i;
     for( i=length/2;i>0;i--)
     {
             heap_adjust(data,i,length);
     }
     for(i=length;i>1;i--)
     {
        int temp=data[i-1];
        data[i-1]=data[0];
        data[0]=temp;
        heap_adjust(data,1,i-1);
     }
}

//
//选择排序 
//
/
void select_sort(int * data,int length)
{
     int index;
     for(int i=0;i<length;i++)
     {
             index =i;
             for(int j=i+1;j<length;j++)
             {
                if(data[j]<data[index]) index=j;                   
            
             }
             
               int temp=data[index];
               data[index]=data[i];
               data[i]=temp;
     }
}

//
//快速排序 
//
/
int partition(int * data,int low,int high)
{
     int middle=data[low];
     while(low<high)
     {
          while(low<high &&  data[high]>=middle) high--; 
          data[low]=data[high];   
          while(low<high &&  data[low]<=middle) low++;                  
          data[high]=data[low];   
     }
     data[low]=middle;
     return low;
}
void qsort(int * data,int low,int high)
{
    if(low<high)
    {
        int mid=partition(data,low,high);
        qsort(data,low,mid-1);
        qsort(data,mid+1,high);        
    }
}

void quick_sort(int * data,int length)
{
     qsort(data,0,length-1);
}
//
//冒泡排序 
//
/
void bubble_sort(int * data,int length)
{
     bool ischange=true;
     for(int i=length-1;i>0 && ischange ;i--)
     {
         ischange=false;
         for(int j=0;j<i;j++)
         {
                 
            if(data[j+1]<data[j])
            {
               ischange=true;
                int temp=data[j+1];
                data[j+1]=data[j];
                data[j]=temp;             
            }
         }
     }
}


//
//插入排序 
//
/
void InsertSort(int * data,int length)
{
     if(length>0)
     {
            for(int i=1;i<length;i++)
            {
                    for(int j=i;j>0;j--)
                    {
                            if(data[j]<data[j-1])
                            {
                               int temp=data[j-1];
                               data[j-1]=data[j];
                               data[j]=temp;
                            }
                            
                    }
                 
            }
     }
}

//
//希尔排序 
//
/ 
void shell_insert(int * data,int length,int dk)
{
     /*
     for(int i=0;i<dk;i++)
     {
          int position=((length-i-1)/dk)*dk+i;
          for(int j=i+dk;j<=position;j+=dk)
          {
              for(int t=j;t>i;t-=dk)
              {
                   if(data[t]<data[t-dk])
                   {
                     int temp=data[t-dk];
                     data[t-dk]=data[t];
                     data[t]=temp;
                   }                  
              }
              
          }
         
     }
     */
     
     for(int i=dk;i<length;i++)
     {
             for(int j=i;j>=0;j-=dk)
             {
                   
                   if(data[j+dk]<data[j])
                   {
                     int temp=data[j+dk];
                     data[j+dk]=data[j];
                     data[j]=temp;
                   }        
             }
     }
     
     
} 

void shell_sort(int * data,int length,int *dk,int t)
{
     for(int i=0;i<t;i++)
     {
             shell_insert(data,length,dk[i]);
     }
}
//
//打印数组 
//
/ 
void print_array(int * data,int length)
{
     int *pBegin=data,*pEnd=data+10;
     
     for(;pBegin!=pEnd;) printf("%d\n",*pBegin++);
     system("pause");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值