温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-05-27 18:23:38 来源:亿速云 阅读:217 作者:Leah 栏目:编程语言

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI