当前位置: 首页 > news >正文

保定网站建设公司大全建设网站的目的

保定网站建设公司大全,建设网站的目的,网站建设哪个公司的好,整合营销传播简称快速排序的非递归 我们写快速排序的时候,通常用的递归的方法实现快速排序,那么有没有非递归的方法实现快速排序呢?肯定是有的。思想还是一样的,不过非递归是看似是非递归其实还是递归。 思路解释 快速排序的非递归使用的是栈这…

快速排序的非递归

我们写快速排序的时候,通常用的递归的方法实现快速排序,那么有没有非递归的方法实现快速排序呢?肯定是有的。思想还是一样的,不过非递归是看似是非递归其实还是递归。

思路解释

快速排序的非递归使用的是栈这个数据结构。我们知道栈是后入先出和先入后出的,所以我们可以通过栈的方式模拟递归,然后实现快速排序的非递归。

如图所示,创建一个栈。然后首先先将数组的起始和末尾的下标存进栈中,然后让left=begin,right=end,并pop出去。然后进行一次快排找到keyi。此时如果keyi两边的区间(绿色的)存在,就把keyi也存进栈。然后进行一次快排,当区间为空或者区间值有序,就把值从栈中pop出来,如果不是,就继续push进去,直到栈为空。最后别忘了把栈给销毁。

代码


int GetMidi(int* a, int begin, int end)
{int midi = (begin + end) / 2;if (a[begin] < a[midi]){if (a[midi] < a[end])return midi;else if (a[begin] > a[end])return begin;elsereturn end;}else{if (a[midi] > a[end])return midi;else if (a[begin] < a[end])return begin;elsereturn end;}
}
int PSort(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int key = begin;int prev = begin;int cur = prev + 1;while (cur <= end){if (a[cur] < a[key] && ++prev != cur)Swap(&a[cur], &a[prev]);++cur;}Swap(&a[key], &a[prev]);key = prev;return key;
}
void QuickSortNonR(int* a, int begin, int end)
{ST s;STInit(&s);STPush(&s, end);STPush(&s, begin);while (!STEmpty(&s)){int left = STTop(&s);STPop(&s);int right = STTop(&s);STPop(&s);int keyi = PSort(a, left, right);// [left, keyi-1] keyi [keyi+1, right]if (left < keyi - 1){STPush(&s, keyi - 1);STPush(&s, left);}if (keyi + 1 < right){STPush(&s, right);STPush(&s, keyi + 1);}}STDestroy(&s);
}

下面是栈的头文件和.c文件

#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct Stack
{int* a;int top;		// 标识栈顶位置的int capacity;
}ST;
void STInit(ST* pst);//初始化栈
void STDestroy(ST* pst);//栈的销毁
void STPush(ST* pst, int x);//栈顶插入
void STPop(ST* pst);//栈顶删除
int STTop(ST* pst);//获取栈顶元素
bool STEmpty(ST* pst);//检查栈是否为空
int STSize(ST* pst);//获取栈中元素的个数
#include "stack.h"
void STInit(ST* pst)
{/*ST* tmp = (ST*)malloc(sizeof(ST));if (tmp == NULL){perror("malloc");return;}*/pst->a = NULL;pst->top = -1;pst->capacity = 0;
}
void STPush(ST* pst, int x)
{assert(pst);if (pst->top == pst->capacity - 1){int newcapacite = pst->capacity == 0 ? 4 : pst->capacity * 2;int* tmp = (int*)realloc(pst->a, newcapacite * sizeof(int));if (tmp == NULL){perror("realloc");return;}pst->a = tmp;pst->capacity = newcapacite;}pst->a[pst->top + 1] = x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);pst->top--;
}
int STTop(ST* pst)
{assert(pst);if (pst->top == -1){printf("此栈为空");return 1;}return pst->a[pst->top];
}
bool STEmpty(ST* pst)
{assert(pst);return pst->top == -1;
}
int STSize(ST* pst)
{assert(pst);return pst->top++;
}
void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = 0;pst->top = -1;}

http://www.yayakq.cn/news/880722/

相关文章:

  • 山东省建设局拖欠工资网站网站开发人员是做什么的
  • 扬州网站商城建设价格杭州住房和城乡建设局网站
  • 简单flash网站模板手机网页游戏平台
  • 温州做网站建设多少钱通辽大柒网站建设有限公司
  • 慧聚创新网站建设网件路由器做网站
  • h5个人网站模板下载专门做视频的网站
  • 天津做网站的公司大良营销网站建设价格
  • 怎么做分享网站西峰住房和城乡建设局网站
  • 如何制作网站要钱吗三维家设计新手教学教程
  • 平台推广策划文案seo推广方式是什么呢
  • 游乐园网站建设北京市运动会网站建设
  • 口碑好的定制网站建设服务商wordpress手机主题浮动菜单
  • 贸易网站建设案例物流做网站哪家好
  • 外贸网站免费建设外贸网站做多少钱的
  • 济南烨铭网站建设网页设计精选网站
  • 招生就业网站开发详情百度上找不到网站
  • 众筹网站建设 网站定制开发wordpress去掉导航框
  • 电子商务网站建设与管理学习心得网页类界面图片
  • 彩票网站开发系统如何搭建长沙有哪些大型工厂
  • 网站为什么需要备案号工作证的照片几寸
  • 做电商网站一般多少钱wordpress主页添加meta
  • 龙岗网站设计市场视频分享网站模板
  • 旅游网站建设网站设计类书籍网站
  • 企业网站建设优势深圳比较有名的外贸公司
  • 上海定制化网站开发公司网站加载速度优化
  • 电商网站首页设计app开发团队公司
  • 江门学做网站课程民政网站建设情况汇报
  • 专业做网站系统网站首页动画效果
  • 嘉兴网站建设全包做电影网站哪个服务器好
  • 预约型网站模板源码租房子网站怎么做