排序之快排

排序之快速排序

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤

1.从数列中挑出一个元素,称为 "基准"(pivot)
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。递归到最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个演算法总会结束,因为在每次的迭代中,它至少会把一个元素摆到它最终的位置去。

伪代码

function quicksort(q)
     var list less, pivotList, greater
     if length(q) ≤ 1 {
         return q
     } else {
         select a pivot value pivot from q
         for each x in q except the pivot element
             if x < pivot then add x to less
             if x ≥ pivot then add x to greater
         add pivot to pivotList
         return concatenate(quicksort(less), pivotList, quicksort(greater))
     }

c实现

#include<stdio.h>
void swap(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void quicksort(int a[],int left,int right)
{
    int last,i;
	int pivot=a[left];
	if(left>=right)
	  return;
	last=left;
	for(i=left+1;i<=right;i++)
	  if(pivot>a[i])
		swap(&a[++last],&a[i]);
	swap(&a[left],&a[last]);
	quicksort(a,left,last-1);
	quicksort(a,last+1,right);
}
int main()
{
	int i;
	int a[]={1,5,7,2,4,6,9,8,4,2};
	quicksort(a,0,9);
	for(i=1;i<=9;i++)
	  printf("%d ",a[i]);
	printf("\n");
}


posted @ 2014-12-13 23:33  battzion  阅读(173)  评论(0编辑  收藏  举报