快排和堆排都是工作中用的比較多的兩種排序算法。
快排:如果有N個元素待排序,進行N次循環,每一次循環將一個元素放到應該到位置。
int participation(int *a,int begin,int end)
{
int pivot;
int i,k=begin;
for(i=begin;i<end;i++)
{
if(a[i]<a[end])
{
SWAP(a[i],a[k]);
k++;
}
}
SWAP(a[k],a[end]);
return k;
}
void quicksort(int *a,int begin,int end)
{
int pivot;
if(begin<end)
{
pivot=participation(a,begin,end);
quicksort(a,begin,pivot-1);
quicksort(a,pivot+1,end);
}
}
堆排:先建大頂堆,然後將大頂堆堆頂與最後一個元素交換,堆大小減一,然後再調整大頂堆,將大頂堆堆頂與最後一個元素交換。
void heap_max(int *a,int pos,int len)//建大頂堆
{
int son,dad;
dad=pos;
son=2*dad+1;
while(son<len)
{
if((son+1)<len&&a[son+1]>a[son])
{
son=son+1;
}
if(a[son]>a[dad])
{
SWAP(a[son],a[dad]);
dad=son;
son=2*dad+1;
}
else
{
break;
}
}
}
void heap_sort(int *a)
{
int i;
for(i=N/2-1;i>=0;i--)
{
heap_max(a,i,N);
}
SWAP(a[0],a[N-1]);
for(i=N-1;i>0;i--)
{
heap_max(a,0,i);
SWAP(a[0],a[i-1]);
}
}