我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

如何在C语言中实现快速排序

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

创新互联主营朝阳网站建设的网络公司,主营网站建设方案,成都App定制开发,朝阳h5微信小程序搭建,朝阳网站营销推广欢迎朝阳等地区企业咨询

快速排序的递归算法

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


本文名称:如何在C语言中实现快速排序
本文网址:http://mswzjz.cn/article/pjeicg.html

其他资讯