您的位置:首页 > 编程语言 > C语言/C++

快速排序---C语言实现

2016-02-06 13:18 531 查看
快速排序是这样的一种排序算法,每次将关键字放在合适的位置上,关键字之前的都比它小,之后的都比它大,接下来用两种方式实现快速排序的算法,递归和非递归。先看下递归版本的

int partation(ELEM_TYPE *arr,int left,int right)

{

ELEM_TYPE tmp=arr[left];

while(left<right)

{

while(left<right && tmp<=arr[right])

{

right--;

}

arr[left]=arr[right];

//right--;

 

 

while(left<right && tmp>=arr[left])

{

left++;

}

arr[right]=arr[left];

}

arr[left]=tmp;

return left;

}

//快速排序

void quick_sort(ELEM_TYPE *arr,int left,int right)

{

if(left<right)

{

int pos=partation(arr,left,right);

quick_sort(arr,left,pos-1);

quick_sort(arr,pos+1,right);

 

}

 

}

 

//非递归版本,借助栈来实现,

 

void quick_sort(ELEM_TYPE *arr,int left,int right,d_stack *p)

{

int mid;

int s1;

int s2;

if(left<right)

{

mid = partation(arr,left,right);

}

if(left < (mid - 1))            //左半边入栈

{

push(p,left);

push(p,mid-1);

}

if((mid+1) < right)            //右半边入栈

{

push(p,mid+1);

push(p,right);

}

 

while(!isempty(p))            //循环直到栈为空,说明已排好序

{

pop(p,&s2);

pop(p,&s1);

mid=partation(arr,s1,s2);

if(s1<(mid-1))

{

push(p,s1);

push(p,mid-1);

}

if(mid+1<s2)

{

push(p,mid+1);

push(p,s2);

}

}

}

 

复杂度分析:

由以上程序可以看出,每次都是一半一半地进行,故时间复杂度为log2N,相对基本排序较快。快速排序算法适合大量无需的数据的排序。如果数据有序,会进行多次额外的交换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: