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

桂林网站制作百度风云榜游戏

桂林网站制作,百度风云榜游戏,网站后台密码忘记,无锡网站建设专家无锡网站制作前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈…

前言:

  上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈来模拟实现递归的过程

思路图分析:

  因为使用c语言写的,所以需要我们自己写一个栈,栈的实现我这里不再过多赘述,我会把栈的码放在最后。假如我们现在有下面这组数组,我们要对它进行排序。(注意下面的数字代表下标)

好,接下来开始用栈模拟递归:(图中栈中的数字均表示下标)

1.第一次入栈:

将整个数组入栈,也就是下标为0-8

2.第一次出栈:

每次出栈,对出栈的下标区间进行一次部分排序,这里的部分排序,就是选出key,将其放在正确的位置有3种实现方法,如有不懂可以看我上一期博客,这里我选的是双指针法。第一次出栈进行第一趟部分排序后,数组的元素变为如下图:

此时的key也就是45就被放在了正确的位置,也就是左边的元素都比它小,右边的元素都比它大。

然后再将key的左区间和右区间分别入栈,也就是0-3和5-8

3.第二次出栈:

根据栈的性质后入先出,所以我们让5-8出栈:

跟上面一样,每次出栈对相应区间进行一次部分排序,排序完如下图:

因为在对这个区间进行部分排序时,67被选为key,此时67的右边已经全部比他大,所以排完序后不变,然后再将key的左区间和右区间分别入栈(注意此时的左区间和右区间加起来应该是5-8,因为我们是对5-8这个区间进行部分排序的,而不是0-8),左区间没有元素了也就是4-4,右区间6-8,注意这时候左区间就已经没有必要入栈了(因为少于2个元素必定有序了),只需将没排好序的右区间入栈即可:

4.第二次入栈:

然后只要栈不为空,我们就出栈然后进行和上面一样的操作。

现在就不难感受出,这其实是在模拟递归的过程。

5.第三次出栈:

部分排序后如下图:

跟上面同理左区间少于两个元素不必入栈,右区间入栈7-8

6.第三次入栈:

然后又是7-8出栈,再判断是否入栈,出栈,判断是否入栈,出栈,判断是否入栈一直重复,直到栈里面为空,就排好了,所以循环的使用在这里面也很重要,下面来看一下全部代码吧!

代码:

#include<stdio.h>
#include"Stack.h"void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}int PartSort3(int* a, int begin, int end)//双指针法
{int keyi = begin;int prev = begin;int cur = begin + 1;while (cur <= end){if (a[cur] < a[keyi] && ++prev != a[cur]){Swap(&a[cur], &a[prev]);}cur++;}Swap(&a[prev], &a[keyi]);keyi = prev;return keyi;
}void QuickSortNonR(int* a, int begin, int end)
{Stack s;StackInit(&s);StackPush(&s, end);StackPush(&s, begin);//第一次入栈首尾下标while (!StackEmpty(&s))//栈只要不为空,就一直出栈,判断是否入栈......{int left = StackTop(&s);StackPop(&s);int right = StackTop(&s);StackPop(&s);//出栈,首元素下标放在left,尾元素下标放在right,很形象int keyi = PartSort3(a, left, right);//进行一次部分排序,并将最后key的下标返回//[left,keyi-1]keyi[keyi+1,right]//拆分成的区间//下面为判断是否入栈if (left < keyi - 1)//如果左区间元素个数不少于2{StackPush(&s, keyi - 1);StackPush(&s, left);//入栈}if (keyi + 1 < right)//如果右区间元素个数不少于2{StackPush(&s, right);StackPush(&s, keyi+1);//入栈}}//循环结束,栈为空,排序完成StackDestroy(&s);//销毁栈
}

栈的实现代码:

#include"Stack.h"
void StackInit(Stack* ps)//初始化栈
{ps->a = NULL;ps->top = -1;ps->capacity = 0;
}
void StackPush(Stack* ps, STDateType data)//入栈
{StackCheck(ps);ps->top++;ps->a[ps->top] = data;
}
void StackCheck(Stack* ps)//检查容量
{assert(ps);if(ps->top+1==ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDateType* tmp = (STDateType*)realloc(ps->a, sizeof(STDateType) * newcapacity);if (tmp == NULL){perror("realloc");return;}else{ps->a = tmp;ps->capacity = newcapacity;}}
}
bool StackEmpty(Stack* ps)//判空函数
{return ps->top == -1;
}
STDateType StackTop(Stack* ps)//获取栈顶元素
{assert(ps);assert(ps->top+1 > 0);return ps->a[ps->top];
}
void StackPop(Stack* ps)//出栈
{assert(ps);ps->top--;
}
int StackSize(Stack* ps)//获取栈中有效元素的个数
{assert(ps);return ps->top+1;
}
void StackDestroy(Stack* ps)//销毁栈
{assert(ps);free(ps->a);ps->a = NULL;ps->top = -1;ps->capacity = 0;
}

栈的头文件:

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int STDateType;
typedef struct Stack
{STDateType* a;int top;//栈顶int capacity;//容量
}Stack;
void StackInit(Stack* ps);//初始化栈
void StackCheck(Stack* ps);//检查容量
void StackPush(Stack* ps, STDateType data);//入栈
void StackPop(Stack* ps);//出栈
bool StackEmpty(Stack* ps);//判空函数
STDateType StackTop(Stack* ps);//获取栈顶元素
int StackSize(Stack* ps);//获取栈中有效元素的个数
void StackDestroy(Stack* ps);//销毁栈

http://www.dinnco.com/news/34214.html

相关文章:

  • wordpress主页分栏seo关键词优化培训
  • 水滴保险官方网站seo站长论坛
  • 单页面网站 wordpress网络优化有前途吗
  • 工作室网站设计百度网盘搜索入口
  • wordpress怎样显示文章全部列表肥城市区seo关键词排名
  • 宝安做棋牌网站建设哪家服务好今日头条十大热点
  • 点子网站制作短视频精准获客系统
  • 做电脑网站用什么软件有哪些短视频营销优势
  • 建设校园网站必要性seo的基本步骤顺序正确的是
  • 做网站后期自己可以维护吗广东东莞疫情最新消息今天又封了
  • 深圳 手机网站建设seo数据监控平台
  • 网站建设者属于广告经营者吗互联网营销师培训多少钱
  • 通州网站建设公司360关键词排名推广
  • 电脑上常用的办公软件宁波百度快照优化排名
  • 模板免费网站流量精灵官网
  • 杭州做销售去哪个网站好济南seo的排名优化
  • 软件毕设代做网站小说排行榜百度
  • 做网站报价单搜索引擎营销包括
  • 政府建立网站的好处怎么在百度上免费做广告
  • wordpress登录密码记录在哪里五年级上册语文优化设计答案
  • 融安有那几个网站做的比较好的搜收录批量查询
  • WordPress免插件广告网站关键词优化推广
  • 做网站如何找项目毛戈平化妆培训学校官网
  • 网站开发功能书百度在线识图查图片
  • 太原网站制作哪家便宜文件外链
  • 广告艺术设计seo网址
  • 广州网站建设方案app广告联盟
  • 前端怎么在猪八戒网站接单做网上推广培训
  • 做外贸的有哪些网站青岛快速排名
  • 建设银行杭州网站首页世界500强企业名单