归并排序温习~

来源:互联网 发布:淘宝的询单有礼在哪里 编辑:程序博客网 时间:2024/06/11 05:42
#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,intk)
 {
  int temp = *(array+i);
  *(array+i) = *(array+k);
  *(array+k) = temp;
 }
 void InsertSort(int *array,intlen)//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,intlen)//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,intlen)//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;
}
 
0 0