C语言中的排序算法

1.堆排序

#include <stdio.h>

int parent(int i);  //父节点
int left(int i);    //左节点
int right(int i);   //右节点
void max_heapify(int *a,int i,int len); 
void build_max_heap(int *a,int len); 
void heapsort(int *a,int len);

int main()
{
int a[]={1,5,8,74,9,11,95,41,62,10,3,11};
int i;
heapsort(a,10);
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
int parent(int i)
{
return i/2;
}
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i-1;
}
void heapsort(int*a,int len)
{
int i,heap_size;
heap_size=len;
build_max_heap(a,heap_size);
for(i=heap_size;i>=2;i--)
{
a[0]=a[0] ^ a[i-1];
a[i-1]=a[0] ^ a[i-1];
a[0]=a[0] ^ a[i-1];
heap_size--;
max_heapify(a,1,heap_size);
}
}
void max_heapify(int *a,int i,int len)
{
int l,largest,heap_size;
l=left(i);
r=right(i);
heap_size=len;
if(l<=heap_size && a[l-1]>a[i-1])
largest=l;
else largest=i;
if(largest!=i)
{
a[i-1]=a[i-1] ^ a[largest-1];
a[largest-1]=a[i-1] ^ a[largest-1];
a[i-1]=a[largest-1] ^ a[i-1];
max_heapify(a,largest,len);
}
}
void build_max_heap(int *a,int len)
{
int heap_size,i;
heap_size=len;
for(i=len/2;i>=1;i--)
max_heapify(a,i,heap_size);
}

2.快排序

#include <stdio.h>
int main()
{
void QuickSort(int a[],int n);
int arr[]={1,5,9,0,14,96,85,26,14,88};
QuickSort(arr,8);
for(int i=0;i<8;i++)
{
printf("%d ",arr[i]);
}
}
void QuickSort(int arr[],int n)
{
if(n<=1)
return;
int i=0;j=n-1;
int key=arr[0];
int index=0;
while(i<j)
{
//从后向前搜索
while(j>i && arr[j]>=key)
j--;
if(j==i)
break;
else
{
//交换 a[j] a[i]
int k=a[j];
a[j]=a[i];
a[i]=k;
index=j;
}
//从前向后搜索
while(i<j && arr[i]<=key)
i++;
if(i==j)
break;
else
{
//交换 a[i] a[j]
int l=arr[j];
arr[j]=arr[i];
arr[i]=l;
index=i;
}
}
QuickSort(arr,index);
QuickSort(arr+index+1,n-1-index);
}



















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值