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

益阳学校网站建设财经类 直播类网站开发

益阳学校网站建设,财经类 直播类网站开发,建工网站,asp网站自动识别手机快速排序是非常适合使用递归的,但是同时我们也要掌握非递归的算法 因为操作系统的栈空间很小,如果递归的深度太深,容易造成栈溢出 递归改非递归一般有两种改法: 改循环借助栈(数据结构) 图示算法 不是…

快速排序是非常适合使用递归的,但是同时我们也要掌握非递归的算法

因为操作系统的栈空间很小,如果递归的深度太深,容易造成栈溢出

递归改非递归一般有两种改法:

  1. 改循环
  2. 借助栈(数据结构)

图示算法 

 

不是递归,我们模拟递归的过程

代码示例

创建一个栈s,先入end,再入begin,先出左再出右

然后找这个区间的keyi,找到之后左区间就是[left,keyi-1],右区间就是[keyi+1,right]

如果区间不止一个值,那就继续入栈,单趟排序,入栈的顺序应与前面保持一致

stack

stack.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int STDataType;
typedef struct Stack
{int* a;int top;//标识栈顶位置int capacity;
}ST;
//初始化
void STInit(ST* pst);
//销毁
void STDestroy(ST* pst);
//入栈
void STPush(ST* pst, STDataType x);
//出栈
void STPop(ST* pst);
//返回栈顶元素
STDataType STTop(ST* pst);
//判空
bool STEmpty(ST* pst);
//栈的元素个数
int STSize(ST* pst);

stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"
//初始化
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;
}
//销毁
void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}
//入栈
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType * )realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}
//出栈
void STPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}
//返回栈顶元素
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst -> a[pst->top - 1];
}
//判空
bool STEmpty(ST* pst)
{assert(pst);/*if (pst->top == 0){return true;}else{return false;}*/return pst->top == 0;
}
//栈的元素个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}

QuickSortNonR

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}elsebreak;}a[end + 1] = tmp;}
}
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[end] > a[begin])return begin;elsereturn end;}
}
//前后指针法
int PartSort3(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;int prev = begin, cur = begin + 1;while (cur <= end){//if (a[cur] < a[keyi])//{//	++prev;//	Swap(&a[prev], &a[cur]);//	++cur;//}//else//	++cur;if (a[cur] < a[keyi] && ++prev != cur)Swap(&a[prev], &a[cur]);++cur;}Swap(&a[keyi], &a[prev]);keyi = prev;return keyi;
}
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 = PartSort3(a, left, 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);
}

递归相当于把这些数据存到栈帧里边,而非递归是将核心区间存存到数据结构栈里面

快速排序的特性总结

  1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(logN)
  4. 稳定性:不稳定

 

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

相关文章:

  • 怎么做百度快照让网站排前面成都最好的seo外包
  • 旅游网站效果图快手app下载安装免费下载
  • 做网站实训目的和意义漯河网站建设
  • 不懂技术与产品怎样做网站淘宝店铺怎么推广
  • 来广营做网站360建筑网发布的简历
  • 网站留言效果怎么做学校网站建设分工
  • 岐山县住房和城市建设局网站免费网页转app
  • 企业网站总承包建设模式关键步骤优秀网站设计案例
  • 网站怎么做架构网站的发展趋势
  • 网站优化排名工具云服务器配置
  • 牛商网 做的p2p网站吉林智能网站建设找哪家
  • 龙岗网站建设过程代理公司注册有什么猫腻
  • 网站seo方案案例网站地图生成软件
  • 自己做的网站打开速度慢WordPress管理app
  • html5和ria网站设计wordpress 移动端双模板
  • 多少企业需要网站建设asp如何做网站
  • 扬州整站seo找别人做网站需要注意什么
  • 做电影网站选择什么配置的服务器wordpress搜索内容
  • 做网站运维应该看的书引流推广话术文案
  • 黄骅市网站建设价格平台代理商
  • 网站开发学些什么软件腾讯官方网站建设
  • 广州建设企业网站机械加工网名大全
  • 网站建设行内资讯我注册过的网站
  • 淘宝客网站搭建营销咨询
  • 导航滑动整屏网站百度收录时间
  • 莱城高新区建设局网站九冶建设有限公司官方网站
  • 如何在网站后台找到死链接怎么做网页挣钱
  • 做网站需要合同吗企业网站建设推广公司
  • 教育网站图片宁波正规seo推广公司
  • 沧州市网站制作公司dedecms做自适应网站