排序——快速排序

转载 2016年05月30日 20:01:51

定义:

        在快速排序算法中,使用了分治策略,将要排序的序列分成两个子序列,然后递归地对子序列进行排序,直到整个序列排序完毕。


步骤:

1.在序列中选择一个关键元素作为轴;


2.对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上


3.递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。

        

        从上图可以看出,每次的比较选取的key元素为序列最后的元素


C语言实现:

#include <stdio.h>
#include <stdlib.h> 

void swap(int *x,int *y)
{
   int temp;
   temp = *x;
   *x = *y;
   *y = temp;
}

int choose_pivot(int i,int j )
{
   return((i+j) /2);
}

void quicksort(int list[],int m,int n)
{
   int key,i,j,k;
   if( m < n)
   {
      k = choose_pivot(m,n);
      swap(&list[m],&list[k]);
      key = list[m];
      i = m+1;
      j = n;
      while(i <= j)
      {
         while((i <= n) && (list[i] <= key))
                i++;
         while((j >= m) && (list[j] > key))
                j--;
         if( i < j)
                swap(&list[i],&list[j]);
      }
     // 交换两个元素的位置
      swap(&list[m],&list[j]);
     // 递归地对较小的数据序列进行排序
      quicksort(list,m,j-1);
      quicksort(list,j+1,n);
   }
}

void printlist(int list[],int n)
{
   int i;
   for(i=0;i<n;i++)
      printf("%d\t",list[i]);
}

void main()
{
   const int MAX_ELEMENTS = 10;
   int list[MAX_ELEMENTS];

   int i = 0;
   
   // 产生填充序列的随机数
   for(i = 0; i < MAX_ELEMENTS; i++ ){
     list[i] = rand();
   }
   printf("进行排序之前的序列:\n");
   printlist(list,MAX_ELEMENTS);
   
   // sort the list using quicksort
   quicksort(list,0,MAX_ELEMENTS-1);

   // print the result
   printf("使用快速排序算法进行排序之后的序列:\n");
   printlist(list,MAX_ELEMENTS);
}


总结:

        快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,工需要划分K-1次关键字的比较。

        最坏的情况:每次划分选取的基准(关键元素)都是当前无序区间中最小(或者最大)的记录,划分的结果就是基准左边的子区间为空(或右边的子区间为空),而划分所得的另外一个非空子区间中记录的数目,仅仅比划分前的无序区中记录的个数少一个。时间复杂度为:O(n*n)

        最好的情况:每次划分所取的基准都是当前无序区的“中值”记录,划分的结果是基准的左右两个无序区的长度大致相等。时间复杂度为:O(n*lgn)

        尽管快速排序的最坏时间复杂度为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快的,平均时间复杂度为O(n*lgn)。

举报

相关文章推荐

【图像处理】windows 10 + vs2015+ opencv3.0.0 +附加模块opencv_contrib编译和配置

win 10 64位系统,使用vs2015,基于opencv3.0.0,集成附加模块opencv_contrib,并编译、配置,正常使用SIFT等功能。

Lua 5.3 源码解读(一) VS 2015 编译源码

引言:用 lua 来编写功能的时间很长,但对于 lua 的底层原理其实知之甚少,只知道它是开源的,用 C 语言写的。今天趁着手头任务不紧,想着还是花点时间读读源码吧,总得调点恶心自己的事情干干知道自己...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

OpenCV学习笔记(八)—— OpenCV 3.1.0 + opencv_contrib编译(Windows)

由于在学习图像识别中的特征点检测中,需要用到Surf和Sift算法,但是这两个算法在OpenCV 3.1.0的Release版本中并不存在,因为他们是存放在opencv_contrib目录下面的未稳定...

ubuntu16.04+opencv3.2.0

进来需要在linux下用到opencv,虽然linux中自带的python自带了opencv类似的图像处理函数,但是如果在linux中写C++ 就不好玩了,所以今天琢磨了好久才弄明白linux下怎么使...

Opencv3.1.0+opencv_contrib配置及使用SIFT测试

因为需要用到一些比较新的跟踪算法,这两天装了opencv3.1并配置了opencv_contrib,并使用了SIFT算法测试是否配置成功。 1.opencv3.1安装与配置 这里不多言,不熟悉的可...

samba+Xshell连接Linux共享目录

引言:之前我们在Windows下建立共享目录,然后再Linux中去访问的步骤,那么反过来,假如此时Linux服务器处于远端(例如云服务器),那就需要在Linux系统下简历共享目录,然后再Windows...

Oracle 数据库的备份与恢复沈阳二手电脑回收

Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份。 一、 导出/导入(Export/Import) ...

将Tomcat6作为系统服务安装

转自:http://www.tot.name/show/12/89/20051103092851.htm我使用的tomcat6.018,经实战,在运行service.bat install后,显示服务...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)