归并排序温习~

#include <stdio.h>
#include <stdlib.h>

void
printf_array(int *array,int len)
{
  int i=0;
  for(i =0;i<len;i++)
  {
  printf("%d ",*(array+i) );      
  //printf("%d ",array[i] );      
  }                  
  printf("\n");
                 
  void swap_array(int *array,int i,int k)
  {
  int temp = *(array+i);
  *(array+i) = *(array+k);
  *(array+k) = temp;
  }
  void InsertSort(int *array,int len)//O(n*n)
  {
    int i=0,j=0;
    int k = -1;    
    int temp=-1;
    for(i=1;i<len;i++)
    {
    k=i;
    temp = *(array+k);
    for(j=i-1;(j>=0)&&(*(array+j) > temp);j--)
    {
      *(array+j+1) = *(array+j);
      k = j;              
    }
    *(array+k) =temp;
    }
  }
  void SelectSort(int *array,int len)//O(n*n)
  {
    int i=0,j=0;
    int k = -1;
    for(i=0;i<len;i++)
    {
    k=i;
        for(j=i;j<len;j++)
        {
        if( *(array+j) < *(array+k) )
            k = j;          
        }
    swap_array(array,i,k);//找出最小的然后和有序的最后的替换 
    }    
   
  }
  void BubblSort(int *array,int len)
  {
  int i=0;
  int j=0;
  int exchange=1;
  for(i=0;i<len && exchange;i++)
  {
    exchange = 0;
    for(j=len-1;j>i;j--)    
    {          
    if(*(array+j-1) > *(array+j) )//如果有逆序,则交换,并记录 
    {
    swap_array(array,j-1,j);
    exchange = 1;
   
    }
   
 
  printf("exchange times %d\n",i);    
  }
 
  void ShellSort(int *array,int len)//O(n*n)
  {
    int i=0,j=0;
    int k = -1,gap;
    int temp =-1;
   
    gap = len;
    do
    {
        gap = gap/3+1;// 一般取的是3 
        for(i=gap;i<len;i+=gap)//当最终gap=1;就是插入排序了 
        {
        k=i;
        temp = *(array+k);
        for(j=i-gap;(j>=0)&&(*(array+j) > temp);j-=gap)
        {
          *(array+j+gap) = *(array+j);
          k = j;              
        }
        *(array+k) =temp;
        }
    }while(gap > 1);
  }
  int partition(int *array,int low,int high )
{
        int pv;
        pv = *(array+low);
        while(low < high)
        {
            //先从高的比较,这个 
            while((low<high) && (*(array+high) >= pv))//>=升序排序 
            {
            high--;
            }
            swap_array(array,low,high);  
           
            while((low <high) &&( *(array+low) <= pv ))
            {
            low++;            
            }
            swap_array(array,low,high);
           
        }
        return low;
}
  int count;
void QSort(int *array,int low,int high)
{

  if(low < high)
  {
  int pivot = partition(array,low,high);//每划分一次,就把该元素该留的位置确定了。 
  count++;
  printf("count is %d -->%d\n",count,pivot);
  QSort(array,low,pivot-1);
  QSort(array,pivot+1,high);
  }      
}
void QuickSort(int *array,int len)
{
  QSort(array,0,len-1);
}

void Merge(int *src,int *des,int low,int mid,int high)
{
int i,j,k;
i = low;
j = mid+1;
k = low;
while( (i<=mid) && (j<=high) )
{
if(*(src+i) < *(src+j))
{
*(des+k) =*(src+i);
k++;
i++;
}
else
{
*(des+k) =*(src+j);
k++;
j++;
}
}
//比较之后剩下的复制到目的地 
while( i<=mid)
{
*(des+k) =*(src+i);
i++;
k++;
}
while( j<=high)
{
*(des+k) =*(src+j);
j++;
k++;
}
}
void MSort(int *src,int *des,int low,int high,int max)
{
if(low == high)
{
*(des+low) = *(src+low);
}
else
{
int mid = (low+high) / 2;
//申请临时的空间 
int *space = (int*) malloc(sizeof(int) * max);
if( space !=NULL)
{
//稳定的排序,不会有元素一下子跑前面去 
MSort(src,space,low,mid,max);
MSort(src,space,mid+1,high,max);
Merge(space,des,low,mid,high);
}
free(space);
}
}
void MergeSort(int *array,int len)
{
//目的和源都是array 
MSort(array,array,0,len-1,len);
}
int main(void )
{
  int array[]={21,25,49,25,16,8};
  int len = sizeof(array) / sizeof(*array);
  //SelectSort(&array[0],len);
  printf("%d\n",len);
  //InsertSort(array,len);
  //BubblSort(array,len);
  //ShellSort(array,len);
  //QuickSort(array,len);
  MergeSort(array,len);
  printf_array(&array[0],len);    
 
  while(1);
  return 0;
}
<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值