各种排序算法总结

转载:http://blog.csdn.net/warringah1/article/details/8951220

明天就要去参加阿里巴巴的实习生笔试了,虽然没想着能进去,但是态度还是要端正的,也没什么可以准备的,复习复习排序吧。

1 插入排序

void InsertSort(int a[], int n)

{

      for (int i=1; i<n; ++i) {

            int key = a[i];

            int j = i - 1;

            while(j>=0 && a[j]>key) {

                  a[j+1] = a[j];

                  --j;

            }

            a[j+1] = key;

      }

}

插入排序是稳定的排序,平均和最坏时间复杂度是O(n^2)。最好的时间复杂度是O(n),对应于全部排好序的情况。

 

2 冒泡排序

void BubbleSort(int a[], int n)

{

      for (int i=1; i<n; ++i) {

            for(int j=0; j<n-i; ++j) {

                  if(a[j]>a[j+1]) {

                       inttemp = a[j];

                       a[j] = a[j+1];

                       a[j+1] = temp;

                  }

            }

      }

}

冒泡排序是稳定的排序,平均和最坏时间复杂度是O(n^2)。

 

3 选择排序

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。

void SelectSort(int a[], int n)

{

      for (int i=0; i<n-1; ++i) {

            for(int j=i+1; j<n; ++j) {

                  if(a[i]>a[j]) {

                       inttemp = a[i];

                       a[i] = a[j];

                       a[j] = temp;

                  }

            }

      }

}

选择排序是不稳定的,因为,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了平均和最坏时间复杂度是O(n^2)。

 

4 希尔排序(缩小增量排序)

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

void ShellSort(int a[], int n)

{

      for (int gap=n/2; gap>0; gap/=2) {

            for(int i=0; i<gap; ++i) {

                  for(int j=i+gapj<nj+=gap) {

                       if(a[j]<a[j-gap]) {

                             int temp = a[j];

                             int k = j-gap;

                             while (k>=0&&a[k]>temp) {

                                   a[k+gap] = a[k];

                                   k -= gap;

                             }

                             a[k+gap] = temp;

                       }

                  }

            }

      }

}

 

void ShellSortImproved(int a[], int n)

{

      for (int gap=n/2; gap>0; gap/=2) {

            for(int j=gapj<n; ++j) {

                  if(a[j]<a[j-gap]) {

                       inttemp = a[j];

                       intk = j - gap;

                       while(k>=0 && a[k]>temp) {

                             a[k+gap] = a[k];

                             k -= gap;

                       }

                       a[k+gap] = temp;

                  }

            }

      }

}

希尔排序是不稳定的。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。使用希尔增量时,最坏运行时间是O(n^2),使用Hibbard增量时,最坏运行时间是O(n^3/2)。

 

5. 堆排序

void MaxHeapify1(int a[], int nint i)

{

      int l = LEFT(i);

      int r = RIGHT(i);

      int largest;

      if (l<n&& a[l]>a[i])

            largestl;

      else

            largesti;

      if (r<n&& a[r]>a[largest])

            largestr;

      if (largest!=i) {

            swap(a[i], a[largest]);

            MaxHeapify1(anlargest);

      } else

            return;

}

 

void MaxHeapify2(int a[], int nint i)

{

      int c,  largest;

      while (1){

            cLEFT(i);

            if (c>=n)

                  break;

            if (a[i]<a[c])

                  largestc;

            else

                  largesti;

            if (c+1<n) {

                  if(a[largest]<a[c+1])

                       largestc + 1;

            }

            if (largest!=i) {

                  swap(a[i], a[largest]);

                  ilargest;

            } else

                  break;

      }

}

 

void HeapSort(int a[], int n)

{

      for (int i=n/2-1; i>=0;--i)

            MaxHeapify1(ani);

      for (int i=n-1; i>0; --i) {

            swap(a[i], a[0]);

            MaxHeapify1(ai, 0);

      }

}

堆排序是原地排序,但是不是稳定排序。时间复杂度O(nlogn)。

 

6 归并排序

void Merge(int a[], int pint qint r)

{

      int n1 = q - p + 1;

      int n2 = r - (q+1) +1;

 

      int *L = new int[n1+1];

      int *R = new int[n2+1];

 

      for (int i=0; i<n1; ++i)

            L[i] = a[p+i];

      for (int i=0; i<n2; ++i)

            R[i] = a[q+1+i];

      L[n1] = INT_MAX;//哨兵

      R[n2] = INT_MAX;

      int i = 0, j = 0;

      for (int k=pk<=r; ++k) {

            if (L[i]<=R[j])

                  a[k] = L[i++];

            else

                  a[k] = R[j++];

      }

      delete[] L;

      delete[] R;

}

 

void MergeSort(int a[], int pint r)

{

      if (p<r) {;

            int q = ((r-p)>>1) + p;

            MergeSort(apq);

            MergeSort(aq+1, r);

            Merge(apqr);

      }

}

合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。时间复杂度是O(nlogn)。可以在空间复杂度O(1)的条件下实现归并排序

 

7. 快速排序

被快速排序所使用的空间,依照使用的版本而定。使用原地(in-place)分区的快速排序版本,在任何递归调用前,仅会使用固定的额外空间。然而,如果需要产生O(log n)嵌套递归调用,它需要在他们每一个存储一个固定数量的信息。因为最好的情况最多需要O(log n)次的嵌套递归调用,所以它需要O(log n)的空间。最坏情况下需要O(n)次嵌套递归调用,因此需要O(n)的空间。

void Median3(int a[], int pint r)

{

      int median = p + ((r-p)>>1);

      if (a[p]>a[median])

            swap(a[p], a[median]);

      if (a[p]>a[r])

            swap(a[p], a[r]);

      if (a[median]>a[r])

            swap(a[median], a[r]);

      swap(a[median], a[r]);

}

 

int Partition1(int a[], int pint r)

{

      Median3(apr);

      int x = a[r];

      int i = p - 1;

      for (int j=pj<=r-1; ++j) {

            if (a[j]<=x) {

                  ++i;

                  swap(a[i], a[j]);

            }

      }

      swap(a[i+1], a[r]);

      return i+1;

}

 

int Partition2(int a[], int pint r)

{

      Median3(apr);

      int i = p-1, j = r;

      int x = a[r];

      for (;;) {

            while(a[++i]<x);

            while(a[--j]>x);

            if (i<j)

                  swap(a[i], a[j]);

            else

                  break

      }

      swap(a[i], a[r]);

      return i;

}

 

void QuickSort(int a[], int pint r) {

      if (p<r) {

            int q = Partition2(apr);

            QuickSort(apq-1);

            QuickSort(aq+1, r);

      }

}

快速排序是不稳定的排序,最差时间复杂度是O(n^2),平均时间复杂度是O(nlogn)。

 

8. 桶排序

void BucketSort(int a[], int n)

{

      int *count = new int[1000];

      memset(count, 0, sizeof(int)*1000);

      for (int i=0; i<n; ++i) {

            ++count[a[i]];

      }

      int k = 0;

      for (int i=0; i<1000; ++i){

            while(count[i]--){

                  a[k++] = i;

            }

      }

}

如果count有M个单元,算法用时O(M+N),桶排序是稳定的排序。但是需要额外的空间。

 

 

稳定的排序有:冒泡,插入,归并,基数,桶。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7 上安装 Zookeeper-3.4.9 服务

在 CentOS7 上安装 zookeeper-3.4.9 服务1、创建 /usr/local/services/zookeeper 文件夹&#xff1a; mkdir -p /usr/local/services/zookeeper 2、进入到 /usr/local/services/zookeeper 目录中&#xff1a; cd /usr/local/services/zookeeper 3、下载 zookeeper-3.4.9.…

HTTP响应报文与工作原理详解

HTTP 是一种请求/响应式的协议&#xff0c;即一个客户端与服务器建立连接后&#xff0c;向服务器发送一个请求;服务器接到请求后&#xff0c;给予相应的响应信息。 超文本传输协议(Hypertext Transfer Protocol&#xff0c;简称HTTP)是应用层协议。HTTP 是一种请求/响应式的协议…

android自定义画板,android 自定义控件 -- 画板

如图&#xff1a;package com.example.myview;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Paint.Style;import android.util.Attrib…

postgreSQl pathman 用法语句总结

2019独角兽企业重金招聘Python工程师标准>>> --新建主表 create table part_test(id int, info text, crt_time timestamp not null); --插入测试数据 insert into part_test select id,md5(random()::text),clock_timestamp() (id|| hour)::interval from generat…

C#-面向对象的多态思想 ---ShinePans

总结: 多态是面向对象的核心.---------能够理解为一个方法,多种实现, 在这里能够用虚方法,抽象类,接口能够实现多态 1.首先利用接口来实现多态: 接口相当于"功能,"接口能够实现多继承,分为 显式实现接口和隐式实现接口 keyword为interface格式: interface 接口名 { …

android jar导出,Android项目导出jar包的小技巧

我们知道&#xff0c;可以通过如下设置将一个普通的Android工程转换成Android Library工程设置前后工程变化如下使用Ant编译时(通过android.bat update project 命令生成 build.xml)&#xff0c;普通的Android工程会生成apk文件&#xff0c;而Android Library工程只生成jar文件…

(五十九)iOS网络基础之UIWebView简易浏览器实现

【UIWebView网络浏览器】 通过webView的loadRequest方法可以发送请求显示相应的网站&#xff0c;例如&#xff1a; NSURL *url [NSURL URLWithString:"http://m.baidu.com"];// 创建请求数据NSURLRequest *request [NSURLRequest requestWithURL:url];// 向服务器发…

无心插柳OR志在必得?阿里推“来往”的意图

近年来&#xff0c;阿里巴巴在外围的动作确实不少&#xff0c;投资新浪微博、投资陌陌&#xff0c;配合阿里自身的一些战略调整&#xff0c;让人觉得这家公司似乎正在经历一场前所未有的“蜕变”。其实这也不难理解&#xff0c;在BAT三国演义中&#xff0c;任何一方都不能对其他…

wampserver的mysql启动与环境变量设置

安装好wampserver以后&#xff0c;mysql服务默认已经启动了。但是直接在命令行里输入"mysql"&#xff0c;系统会提示说 mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 这是因为没有增加“mysql”环境变量,请跳到第3步阅读。 如果之前已经安…

华为mate30怎么申请鸿蒙内测,华为新系统启动内测,mate30系列尝鲜,网友:羡慕...

原标题&#xff1a;华为新系统启动内测&#xff0c;mate30系列尝鲜&#xff0c;网友&#xff1a;羡慕一款手机是否好用&#xff0c;其实取决于两个方面&#xff0c;一个是硬件&#xff0c;另一个则是软件&#xff0c;大家在购机的时候往往最关注的就是硬件配置&#xff0c;因为…

VMware 11完全安装Mac OS X 10.10

----------------------------------------- 引用原文如下&#xff1a; VMware 11安装Mac OS X 10.10_百度经验 http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html VM11安装Mac OS X 10.10 工具/原料 1.VMware Workstation 11 2.unlocker 203&#xff08;for OS…

用C语言写解释器(一)——我们的目标

声明为提高教学质量&#xff0c;我所在的学院正在筹划编写C语言教材。《用C语言写解释器》系列文章经整理后将收入书中“综合实验”一章。因此该系列的文章主要阅读对象定为刚学完C语言的学生&#xff08;不要求有数据结构等其它知识&#xff09;&#xff0c;所以行文比較罗嗦&…

1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例)

前言 在上一篇0_MVCEFAutofac(dbfirst)轻型项目框架_基本框架中&#xff0c;我已经介绍了这个轻型框架的层次结构&#xff0c;在下面的这篇文章中&#xff0c;我将以教师登陆功能为例&#xff0c;具体来扩充下我的core层的代码。 在这之前&#xff0c;我想先补充讨论下是否有必…

Python实现atm机的功能

主要还是参考网上内容&#xff0c;自己做了修改。虽然代码有小bug&#xff0c;但是不影响学习和测试。功能&#xff1a;1.额度&#xff1a;80002.可以提现&#xff0c;手续费5%3.每月最后一天出账单&#xff0c;写入文件4.记录每月日常消费流水5.提供还款接口1.atm的脚本[rootp…

使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

前言 本章将实现非常实用的功能——下载在线视频。涉及到多线程、线程更新UI等技术&#xff0c;还需思考产品的设计&#xff0c;如何将新加的功能更好的融入到现有的产品中&#xff0c;并不是简单的加一个界面就行了&#xff0c;欢迎大家交流产品设计和技术细节实现&#xff01…

HTML声明文档类型后样式出错,doctype如何声明

如何doctype声明&#xff0c;新增的结构元素和功能元素HTML5已形成了最终的标准&#xff0c;概括来讲&#xff0c;它主要是关于图像&#xff0c;位置&#xff0c;存储&#xff0c;多任务等功能的增加。 新增的元素有绘画 canvas &#xff0c;用于媒介回放的 video 和 audio 元素…

Error-Project facet Java version 1.8 is not supported

最近导入最新的Strtus2.5.10.1 Demo时出现了这个错误 解决方案如下&#xff1a; 选中工程——右键——Properties 然后依次展开找到如图所示内容&#xff0c;将1.8改成1.7即可。 原因&#xff1a;工程默认配置是1.8&#xff0c;而本地环境JDK版本为1.7&#xff0c;两则不匹配造…

6.2

转载于:https://www.cnblogs.com/tutuaixiaomei/p/3354356.html

Tomcat全攻略

内容&#xff1a; 一&#xff1a;简单介绍二&#xff1a;安装及配置三&#xff1a;应用四&#xff1a;综述參考资料关于作者宗 锋西北大学计算机系硕士2001 年 12 月 随着java的流行&#xff0c;其在web上的应用也越来越广&#xff0c;tomcat作为一个开源的servlet容器&#xf…

Android Material风格的应用(三)--DrawerLayout

添加抽屉导航 Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--RecyclerViewAndroid Material风格的应用(三)--DrawerLayoutAndroid Material风格的应用(四)--FloatActionButtonAndroid Material风格的应用(五)--CollapsingToolbar DrawerLa…