快排和堆排

快排和堆排都是工作中用的比較多的兩種排序算法。

快排:如果有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]);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章