【数据结构--C语言】常用6种排序可运行(直接插入、折半插入、冒泡、归并、堆排、快排)

直接插入排序

int straight_insert_sort(int *num,int n)  //直接插入排序 
{
 int i;
 int j;
 for(i=2;i<n;i++)
 {
  if(num[i]<num[i-1])
  {
   num[0]=num[i];
   num[i]=num[i-1];
   for(j=i-2;num[0]<num[j];j--)
   {
    num[j+1]=num[j];
   }
   num[j+1]=num[0];
  }
 }
 return 0;
 } 

折半插入排序

int Binary_insert_sort(int *num, int n) //折半插入排序 在已排好序的数组中插入 
{
 int mid,high,low=1;
 int i=high,j;
 for(i=2;i<n;i++)
 {
  low=1;
  high=i-1;
  num[0]=num[i];
  while(low<=high)
  {
   mid=(low+high)/2;
   if(num[mid]<num[0])
   {
    low=mid+1;
   }
   else
   {
    high=mid-1;
   }
  }
  for(j=i-1;j>high;j--)
  {
   num[j+1]=num[j];
  }
  num[j+1]=num[0];
 }

冒泡排序

int bubble_sort(int *num,int n)  //冒泡排序 
{
 int i,j,temp;
 for(i=0;i<n-1;i++)
 {
  for(j=0;j<n-1-i;j++)
  {
   if(num[j]>num[j+1])
   {
    temp=num[j];
    num[j]=num[j+1];
    num[j+1]=temp;
   }
  }
 }
 return 0;
 } 

快速排序

int quick_sort(int *num,int low,int high)  //快速排序 
{
 int i=low,j=high,temp,poi;
 if(low<high)
 {
  temp=num[low];
  while(low<high)
  {
   while(high>low&&num[high]>=temp)
   {
    high--;
   }
   num[low]=num[high];
   while(high>low&&num[low]<temp)
   {
    low++;
   }
   num[high]=num[low];
  }
  num[low]=temp;
  quick_sort(num,i,low-1);
  quick_sort(num,low+1,j);
 }
 return 0;
}

堆排序

int heapadjust(int *num,int start,int end)  //调整堆 
{
 int i;
 int temp;
 temp=num[start];
 for(i=2*start+1;i<=end;i=i*2+1)
 {
  if(i<end&&num[i]<num[i+1])
  {
   i++;
  }
  if(temp>=num[i])
  {
   break;
  }
  num[start]=num[i];
  start=i;
 }
 num[start]=temp;
 return 0;
}
int heap_sort(int *num,int n)  //堆排序 
{
 int i,temp;
 for(i=n/2-1;i>=0;i--) //建初堆 
 {
  heapadjust(num,i,n-1);
 }
 for(i=n-1;i>0;i--)
 {
  temp=num[0];
  num[0]=num[i];
  num[i]=temp;
  heapadjust(num,0,i-1);
  } 

 return 0; 
}

归并排序


int merge(int num[],int temp[],int low,int high)
{
 //  >>的优先级低于+,所以加括号 
  int mid=low+((high-low)>>1);      //防止整数溢出 (low+high)/2;

  int pos=low;
  int p1=low,p2=mid+1;
  if(low<high)
 {
  merge(num,temp,low,mid);
  merge(num,temp,mid+1,high);
  while(p1<=mid&&p2<=high)
  {
   if(num[p1]<=num[p2])
   {
    temp[pos++]=num[p1++];
   }
   else
   {
    temp[pos++]=num[p2++];
   }
  }
  while(p1<=mid)
  {
   temp[pos++]=num[p1++];
  }
  while(p2<=high)
  {
   temp[pos++]=num[p2++];
  }

  while(low<=high)
  {
   num[low]=temp[low];
   low++;
 }

 }
 return 0;
}
int merge_sort(int *num,int n)
{
 int temp[n];
 merge(num,temp,0,n-1);
 return 0;
}

全部代码(选择对应函数可直接运行

#include<stdio.h>

int straight_insert_sort(int *num,int n)  //直接插入排序 
{
 int i;
 int j;
 for(i=2;i<n;i++)
 {
  if(num[i]<num[i-1])
  {
   num[0]=num[i];
   num[i]=num[i-1];
   for(j=i-2;num[0]<num[j];j--)
   {
    num[j+1]=num[j];
   }
   num[j+1]=num[0];
  }
 }
 return 0;
 } 

int Binary_insert_sort(int *num, int n) //折半插入排序 在已排好序的数组中插入 
{
 int mid,high,low=1;
 int i=high,j;
 for(i=2;i<n;i++)
 {
  low=1;
  high=i-1;
  num[0]=num[i];
  while(low<=high)
  {
   mid=(low+high)/2;
   if(num[mid]<num[0])
   {
    low=mid+1;
   }
   else
   {
    high=mid-1;
   }
  }
  for(j=i-1;j>high;j--)
  {
   num[j+1]=num[j];
  }
  num[j+1]=num[0];
 }

}


int bubble_sort(int *num,int n)  //冒泡排序 
{
 int i,j,temp;
 for(i=0;i<n-1;i++)
 {
  for(j=0;j<n-1-i;j++)
  {
   if(num[j]>num[j+1])
   {
    temp=num[j];
    num[j]=num[j+1];
    num[j+1]=temp;
   }
  }
 }
 return 0;
 } 

int quick_sort(int *num,int low,int high)  //快速排序 
{
 int i=low,j=high,temp,poi;
 if(low<high)
 {
  temp=num[low];
  while(low<high)
  {
   while(high>low&&num[high]>=temp)
   {
    high--;
   }
   num[low]=num[high];
   while(high>low&&num[low]<temp)
   {
    low++;
   }
   num[high]=num[low];
  }
  num[low]=temp;
  quick_sort(num,i,low-1);
  quick_sort(num,low+1,j);
 }
 return 0;
}

int heapadjust(int *num,int start,int end)  //调整堆 
{
 int i;
 int temp;
 temp=num[start];
 for(i=2*start+1;i<=end;i=i*2+1)
 {
  if(i<end&&num[i]<num[i+1])
  {
   i++;
  }
  if(temp>=num[i])
  {
   break;
  }
  num[start]=num[i];
  start=i;
 }
 num[start]=temp;
 return 0;
}
int heap_sort(int *num,int n)  //堆排序 
{
 int i,temp;
 for(i=n/2-1;i>=0;i--) //建初堆 
 {
  heapadjust(num,i,n-1);
 }
 for(i=n-1;i>0;i--)
 {
  temp=num[0];
  num[0]=num[i];
  num[i]=temp;
  heapadjust(num,0,i-1);
  } 

 return 0; 
}

int merge(int num[],int temp[],int low,int high)
{
 //  >>的优先级低于+,所以加括号 
  int mid=low+((high-low)>>1);      //防止整数溢出 (low+high)/2;

  int pos=low;
  int p1=low,p2=mid+1;
  if(low<high)
 {
  merge(num,temp,low,mid);
  merge(num,temp,mid+1,high);
  while(p1<=mid&&p2<=high)
  {
   if(num[p1]<=num[p2])
   {
    temp[pos++]=num[p1++];
   }
   else
   {
    temp[pos++]=num[p2++];
   }
  }
  while(p1<=mid)
  {
   temp[pos++]=num[p1++];
  }
  while(p2<=high)
  {
   temp[pos++]=num[p2++];
  }

  while(low<=high)
  {
   num[low]=temp[low];
   low++;
 }

 }
 return 0;
}
int merge_sort(int *num,int n)
{
 int temp[n];
 merge(num,temp,0,n-1);
 return 0;
}
int main()
{
 int num[]={17,7,6,8,9,77,2,5,4,1,15,52,67,35,25,6};
 int n,i;
 n=sizeof(num)/sizeof(int);
// printf("%d\n\n",n);                 
// straight_insert_sort(num,n);
// Binary_insert_sort(num,n);
//  bubble_sort(num,n);
// quick_sort(num,0,n-1);
heap_sort(num,n);
// merge_sort(num,n);
 for(i=0;i<n;i++)
 {
  printf("%d\n",num[i]);
 }
 return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JY_0329

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值