数据结构-栈(应用篇)之快速排序法-C和C++的实现
一、原理解析
快速排序法:
基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面。然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止。
在以下程序案例中我们使用非递归的方式,并借助栈的数据结构实现。(关于栈的基本介绍,请看上一篇:http://www.cnblogs.com/HongYi-Liang/p/7766684.html)

二、程序解析
C语言版本:
源码:
bool bAirob_QuickSort_int16(int16_t *src,int len) //int16_t
{
int i ;
int j ;
int head;
int tail;
MyStack stack={}; Stack_Init(&stack,*len);
Stack_push(&stack,len-);
Stack_push(&stack,); while(Stack_size(&stack))
{
Stack_top(&stack,&head);
Stack_pop(&stack);
Stack_top(&stack,&tail);
Stack_pop(&stack); i=head;
j=tail; while(i<j)
{
while(j>i && src[j]>=src[i])
{
--j;
}
Swap(&src[i],&src[j]); while(i<j && src[i]<=src[j])
{
++i;
}
Swap(&src[i],&src[j]);
}
if(i!=tail)
{
Stack_push(&stack,tail);
Stack_push(&stack,i+);
}
if(i!=head )
{
Stack_push(&stack,i-);
Stack_push(&stack,head);
}
} Stack_Delete(&stack);
return true;
}
void Swap(int16_t *a,int16_t *b)
{
int c=*a;
*a=*b;
*b=c;
}
结果 :
测试程序
#define BUFFSIZE 8
int16_t testbuff[BUFFSIZE] = {,,,,,,,};
int main()
{
int i;
bAirob_QuickSort_int16(testbuff,BUFFSIZE);
for(i=;i<BUFFSIZE;i++)
{
printf("%d ",testbuff[i]);
}
printf("\r\n"); system("pause");
return ;
}
解析:
- 首先声明了一个栈结构stack用于储存还还没排序完成的段落。
- 先把数组头索引和尾索引压入栈中。
- 从栈中把取出两个数数据,第一个作为头索引,第二个作为尾索引。
- 以数组头索引的数据为分界把所有小于它的数放在前面,大于它的数放在后面后面。具体做法是while(i<j){}中的一段,最后i,j会重合。
- 如果前半部分仍能继续分组( i!=head),则把头索引和i的前一个元素索引压入栈中。如果后半部分仍能继续分组(j!=tail),则把i的下一个元素的索引和尾索引压入栈中。(压栈时先压大的索引再压小的索引)
- 循环上面3-5步,直到栈为空。
用上面程序为例子
原始数组:{7,1,6,2,3,5,0,4}
第一次循环时,所有小于7的数放到了左边,大于7的数放到了左边。变成这样{4,1,6,2,3,5,0,7}
第二次循环,对{4,1,6,2,3,5,0,7},对黄色部分操作,所有大于4的数在右边,小于4的数在左边{0,1,3,2,4,5,6,7}。这时候压入栈中有两组数据,4左边一组,4右边一组。
第三次循环,对{0,1,3,2,4,5,6,7}进行操作,0作为最小的数已经在最左边了,所以数组不变。
第四次循环,{0,1,3,2,4,5,6,7},对132操作,同上1是最小且在最左边了,所以不会改变。
第五次循环,{0,1,3,2,4,5,6,7},对32操作,两个数调换了位置{0,1,2,3,4,5,6,7}。到这一部,4的左边已经全部处理完了,接下栈中剩下一组数据,4的右边。
第六次循环{0,1,2,3,4,5,6,7},对56操作,然而他们本身就好了,到这里为止,排序结束。
现在我们再看一次动图(因为动图设置没有数据“0”就用另一个“1”来代替)

数据结构-栈(应用篇)之快速排序法-C和C++的实现的更多相关文章
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- JS数据结构第四篇 --- 栈
一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- PHP两种基础的算法:冒泡、快速排序法》》》望能够帮助到大家
首先扯个淡@@@@@@@@@ 算法是程序的核心,一个程序的好坏关键是这个程序算法的优劣. 冒泡排序法 原理:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的 ...
- Java演算法之快速排序法
1 * 快速排序法(Quick Sort),遞迴版本. 2 * 3 * @param array 傳入要排序的陣列 4 * @param start 傳入要排序的開始位置 5 * @param end ...
- javascript的快速排序法
在排序方式中,快速是比较普遍使用的,因为其速度快. 因为其是不断的递归,而且是根据基准点的左右两边开始递归,直到数组只有一个值的时候才返回. 这个基准点是自己定的. 一般取中间,比较好理解. < ...
- php四种基础算法:冒泡,选择,插入和快速排序法
转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...
- C#实现快速排序法
现在有数组{ 3, 6, 2, 1, 9, 5, 4, 7 }; 然后用快速排序法把他们排序 1.首先 ,取出3作为比较数据 2.从最右边往左边比较找到第一个比3小的数据,把3在数组中的位置赋值为那个 ...
- 快速排序法QuickSort
/** * * @author Administrator * 功能:交换式排序之快速排序 */ package com.test1; import java.util.Calendar; publi ...
随机推荐
- 【SqlServer系列】语法定义符号解析
1 概述 在数据库函数定义中,经常用到这些符号:<>,::=,[],{},|,..,(),!! .这篇文章简要概述这些符号. 2 具体内容 2.1 <> < ...
- check the manual that corresponds to your MySQL server version for the right syntax处理方案
check the manual that corresponds to your MySQL server version for the right syntax:代码出现这样的bug,就要注意你 ...
- 数据的随机抽取 及 jQuery补充效果(菜单、移动)
一.数据的随机抽取 都见过那种考试题从很多题中随机抽取几道的试卷吧,现在就要做这样的一个例子:从数据库中随机抽取几条数据出来显示(例如:一百中随机挑选50条) 随机挑选是要有提交数据的,所以肯定是要有 ...
- centos6.5安装禅道
1.安装禅道需要安装以下环境 mysql php 5 apache 2 2.安装命令 1.安装mysql yum install mysql mysql-server 2.安装apache yum i ...
- 前后端分离ueditor富文本编辑器的使用-Java版本
最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...
- iOS masonry九宫格 单行 多行布局
Masonry是个好东西,在当前尺寸各异的iOS开发适配中发挥着至关重要的作用,由于项目中Masonry布局用的比较多,对于UI布局也有了一些自己的理解,经常会有人问道Masonry布局九宫格要怎么布 ...
- 【NOIP模拟】cut
Description F大爷热爱切树.今天他找到一棵黑白树,不到两秒钟,F大爷就把这棵树切掉了.已知原先树上共n个点,每个点都是黑点或者白点,F大爷切去若干条边后,分成的若干个连通子树中每块恰有一个 ...
- SSH框架完全整合
大三学期渐末,事情也挺多的,上周就开始着手整合SSH框架,到现在才真正的完成,过程中碰到了许多小问题(小问题大折腾,哭脸.jpg).本着善始善终的原则,最终把它给完成了. 本篇文章就在: win7 6 ...
- strtus2中的default-action-ref无效的解决方法
strtus2中的default-action-ref的作用是我们在浏览器中访问错误的地址时可以跳转到自己设置的错误页面,而不是令人尴尬的系统错误页面,这个系统错误很常见,就是提示在namespace ...
- js 深入理解原型模式
我们创建每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象.使用原型的好处是可以让所有对象共享它所包含的属性和方法. function Person(){ } Pers ...
