快速排序---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,相对基本排序较快。快速排序算法适合大量无需的数据的排序。如果数据有序,会进行多次额外的交换。
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,相对基本排序较快。快速排序算法适合大量无需的数据的排序。如果数据有序,会进行多次额外的交换。
相关文章推荐
- c++拷贝函数
- [c++基础]valarray模板详解
- 栈的简单实现——使用C++容器库(STL Stack)
- C++面向对象编程:对象的内存分配与静态成员
- 1012. The Best Rank (25)
- C++动态调用DLL
- 理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串
- C++ 经常使用类 string类
- C语言之数值计算--级数算法
- C语言之数值计算--级数算法
- C语言之数值计算--级数算法
- c++ 对象的互斥访问
- C 指针有害健康
- 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)
- 【LeetCode】9. Palindrome Number
- c++n连环
- 第六届蓝桥杯C/C++B组第八题 移动距离
- C语言const的用法
- HDU 1010 深度搜索问题
- 关于对象的构造、复制构造、析构、赋值的问题