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

佛山论坛建站模板郑州谷歌优化外包

佛山论坛建站模板,郑州谷歌优化外包,单页网页制作视频教程,wordpress注册邮箱配置快速排序是非常适合使用递归的,但是同时我们也要掌握非递归的算法 因为操作系统的栈空间很小,如果递归的深度太深,容易造成栈溢出 递归改非递归一般有两种改法: 改循环借助栈(数据结构) 图示算法 不是…

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

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

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

  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.ds6.com.cn/news/107543.html

相关文章:

  • 网站服务器可以做家用电脑网站收录查询系统
  • 制作网站需要注意什么网站seo关键词设置
  • 超值的镇江网站建设互联网产品运营
  • 网站建设开发公司哪家好求职seo
  • 开题报告旅游网站开发5g站长工具查询
  • 网站建设小企业案例seo是搜索引擎营销吗
  • 沈阳做网站哪家公司好做seo推广一年大概的费用
  • 枣强网站建设地推是什么
  • 音乐网站建设目标今日头条指数查询
  • 宿迁环保局网站建设局搜索引擎推广的三种方式
  • 乌海网站开发广州百度网站快速排名
  • 魏县网站建设推广专业的google推广公司
  • 增长超人做网站多少钱seo站
  • python做网站例子方象科技的服务范围
  • 大学网站建设课程课综纯手工seo公司
  • 安阳网站优化公司推荐推广渠道有哪些方式
  • wordpress 标题栏置顶郴州seo外包
  • 懒人学做网站制作网站代码
  • 网站可以用什么语言开发做百度竞价推广运营
  • 成都网站建制作百度导航怎么下载
  • ubc网站谁做的怎么做网站主页
  • 餐厅网页设计素材厦门seo网站排名优化
  • 多语种网站怎么做搜索引擎排名抚州网络推广
  • 网络服务器是什么东西长沙正规竞价优化服务
  • 网络公司名字最有独特性的做seo的公司
  • 卖菜网站应该怎么做网站访问量统计工具
  • 怎么维护好网站淘宝营销推广方案
  • 手机网站制作代码与web有什么不同徐州seo公司
  • 著名设计网站找个免费的网站
  • 中文网站的seo怎么做百度文库首页官网