如何在C语言中实现快速排序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
快速排序的递归算法
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <malloc.h>
using namespace std;
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int Status;
//输出函数
void Print(int a[], int l, int r)
{
int i;
for(i = l; i <= r; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
//划分函数
int partion(int a[], int left, int right)
{
//取最右边的元素作划分元素
int temp = a[right];
//记录 i = left, j = right
int i = left, j = right-1;
//循环直到左右指针相遇
while(true)
{
//从左边开始扫描,当出现比划分元素大的元素,扫描停止
while(temp > a[i])
{
i++;
}
//从右边进行扫描,当出现比划分元素小的元素,扫描停止
while(temp < a[j] && j >= left)
{
j--;
}
//如果 i >= j, 循环截止,下面的交换不执行
if(i >= j) break;
//交换停止时的元素
swap(a[i], a[j]);
}
//交换该元素与划分元素
swap(a[i], a[right]);
Print(a, 0, 6);
//printf("i = %d", i);
//划分过程结束
return i;
}
//快速排序
void qsort(int a[], int left, int right)
{
//排序完成,循环截止
if(right <= left)
return;
//做划分
int i = partion(a, left, right);
//对左部分排序
if(left < (i-1))
printf("对%d~%d排序\n", left, i-1), qsort(a, left, i-1);
//对右部分排序
if(right > (i+1))
printf("对%d~%d排序\n", i+1, right), qsort(a, i+1, right);
}
int main()
{
int a[7] = {2, 5, 3, 7, 6, 1, 4};
//快速排序
printf("对0~6排序\n");
qsort(a, 0, 6);
Print(a, 0, 6);
return 0;
}
非递归快速排序
快速排序的非递归实现使用了一个显式的下推栈,使用向栈中压入参数和过程调用/退出不断地从栈中弹出参数来替代递归调用,这个过程继续直到栈为空.我们把两个子数组中的较大者压入栈中来确保最大栈的深度为lgN,如果对N个元素进行排序.
void qsort(int a[], int left, int right)
{
int i;
//定义栈s
stack<int> s;
//先判断栈是否为空
while(!s.empty())
{
//若栈不为空,将栈中元素移出
s.pop();
}
//将right入栈
s.push(right);
//将left入栈
s.push(left);
//while循环,当栈为空时,循环结束
while(!s.empty())
{
//元素left出栈
left = s.top(), s.pop();
//元素right出栈
right = s.top(), s.pop();
//判断left与right的关系,如果left>=right,continue
if(left >= right)
{
continue;
}
//作划分
i = partion(a, left, right);
//比较两个子数组的大小
//将子数组中的较大者压入栈
if((i-1-left) > (right-i-1))
{
s.push(i-1);
s.push(left);
s.push(i+1);
s.push(right);
}
else
{
s.push(i+1);
s.push(right);
s.push(i-1);
s.push(left);
}
}
}
看完上述内容,你们掌握如何在C语言中实现快速排序的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。