一、原理解析

快速排序法:

基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面。然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止。

在以下程序案例中我们使用非递归的方式,并借助栈的数据结构实现。(关于栈的基本介绍,请看上一篇: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 ;
}

解析:

  1. 首先声明了一个栈结构stack用于储存还还没排序完成的段落。
  2. 先把数组头索引和尾索引压入栈中。
  3. 从栈中把取出两个数数据,第一个作为头索引,第二个作为尾索引。
  4. 以数组头索引的数据为分界把所有小于它的数放在前面,大于它的数放在后面后面。具体做法是while(i<j){}中的一段,最后i,j会重合。
  5. 如果前半部分仍能继续分组( i!=head),则把头索引和i的前一个元素索引压入栈中。如果后半部分仍能继续分组(j!=tail),则把i的下一个元素的索引和尾索引压入栈中。(压栈时先压大的索引再压小的索引)
  6. 循环上面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++的实现的更多相关文章

  1. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  2. JS数据结构第四篇 --- 栈

    一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...

  3. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  4. PHP两种基础的算法:冒泡、快速排序法》》》望能够帮助到大家

    首先扯个淡@@@@@@@@@ 算法是程序的核心,一个程序的好坏关键是这个程序算法的优劣. 冒泡排序法 原理:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的 ...

  5. Java演算法之快速排序法

    1 * 快速排序法(Quick Sort),遞迴版本. 2 * 3 * @param array 傳入要排序的陣列 4 * @param start 傳入要排序的開始位置 5 * @param end ...

  6. javascript的快速排序法

    在排序方式中,快速是比较普遍使用的,因为其速度快. 因为其是不断的递归,而且是根据基准点的左右两边开始递归,直到数组只有一个值的时候才返回. 这个基准点是自己定的. 一般取中间,比较好理解. < ...

  7. php四种基础算法:冒泡,选择,插入和快速排序法

    转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...

  8. C#实现快速排序法

    现在有数组{ 3, 6, 2, 1, 9, 5, 4, 7 }; 然后用快速排序法把他们排序 1.首先 ,取出3作为比较数据 2.从最右边往左边比较找到第一个比3小的数据,把3在数组中的位置赋值为那个 ...

  9. 快速排序法QuickSort

    /** * * @author Administrator * 功能:交换式排序之快速排序 */ package com.test1; import java.util.Calendar; publi ...

随机推荐

  1. AntiXSS的作用

    XSS跨站脚本攻击        是指用户输入HTML编码对网站进行跨站攻击.            通过使用FCKeditor.FreeTextBox.Rich TextBox.Cute Edito ...

  2. inline-block解决

    一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距 二.方法之移除空格 元素间留白间距出现的原因就是标签段之间的空格,因此,去掉HTML中的空格,自 ...

  3. Python笔记·第二章—— Python的编码问题(一)

    一.什么是编码 可以说,计算机是一个即聪明又笨蛋的家伙.说它聪明,是因为他可以做很多事情,它的强大无需多说,大家应该都有所了解以及感受.但是为什么说它又是个笨蛋呢,因为我们在电脑上写出的每一个字,保存 ...

  4. node.js之路由,中间件,ge请求和post请求的参数

    一.路由 1.什么是路由 服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤 2.实现路由的方法 2.1.get请求访问网址时,做什么事 1 app.get(" ...

  5. shell脚本小案例

    1.获取远程ftp数据到本地目录 #!/bin/bash ftp -n<<! open 135.0.24.19 user exchange exchange binary cd /idep ...

  6. .net core中使用GB2312编码的问题

    最近在用.net core写一个爬虫抓取网页上的数据,碰到了网页编码是GBK的页面,抓取的数据都是乱码,当使用Encoding.GetEncoding("GBK")的时候抛出了异常 ...

  7. iOS 网络状态判断方案(支持iOS11和iPhoneX)

    在之前的iPhone中.我们可以根据导航栏上方的网络状态view.来判断网络状态.(这种方案本来就不太好) 这种方案在iPhone X 手机上.不可使用. 我们可以通过 Reachability  来 ...

  8. Kotlin——最详细的常量、变量、注释的使用

    在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...

  9. 查找 GPU 计算能力

    你能在这里找到你的 GPU 的计算能力: https://en.wikipedia.org/wiki/CUDA#Supported_GPUs

  10. CDQ分治与整体二分小结

    前言 这是一波强行总结. 下面是一波瞎比比. 这几天做了几道CDQ/整体二分,感觉自己做题速度好慢啊. 很多很显然的东西都看不出来 分治分不出来 打不出来 调不对 上午下午晚上的效率完全不一样啊. 完 ...