归并排序温习~

该博客展示了多种排序算法的C语言代码实现,包括插入排序、选择排序、冒泡排序、希尔排序、快速排序和归并排序等。详细给出了各算法的函数定义和逻辑,最后在主函数中调用归并排序对数组进行排序并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值