如何在C语言中实现快速排序-创新互联

如何在C语言中实现快速排序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

成都创新互联服务项目包括琼海网站建设、琼海网站制作、琼海网页制作以及琼海网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,琼海网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到琼海省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

快速排序的递归算法

#include 
#include 
#include 
#include 
#include 
#include 
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 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语言中实现快速排序的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联网站建设公司行业资讯频道,感谢各位的阅读!

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:如何在C语言中实现快速排序-创新互联
网页路径:http://scyanting.com/article/ceipei.html