c++各种排序
1.插入排序
void InsertSort(int a[], int n)
{
int temp, i, j;
for (i = ; i < n; i++)
{
if (a[i] < a[i - ])
{
temp = a[i];
for (j = i - ; j >= && a[j]>temp; j--)
a[j + ] = a[j];
a[j + ] = temp;
}
}
}
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:稳定
2.希尔排序
void ShellSort(int a[], int n)
{
int dk,temp, i, j;
for (dk = n / ; dk >= ; dk /= )
{
for (i = dk; i <n; i+=dk)
{
if (a[i] < a[i - dk])
{
temp = a[i];
for (j = i - dk; j>=&&a[j]>temp; j -= dk)
a[j + dk] = a[j];
a[j + dk] = temp;
}
}
}
}
时间复杂度:O(n1.3)
最坏时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:不稳定
3.冒泡排序
void BubbleSort(int a[], int n)
{
int temp,flag;
for (int i = ; i < n ; i++)
{
flag = ;
for (int j = ; j < n-i; j++)
{
if (a[j]>a[j + ])
{
temp = a[j];
a[j] = a[j + ];
a[j + ] = temp;
flag = ;
}
}
if (flag == ) break;
}
}
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:稳定
4.快速排序:O(nlog)---O(1)----稳定
int Parttion1(int a[], int low,int high)
{
int temp = a[low];
while (low < high)
{
while (low < high&&a[high] >= temp) high--;
a[low] = a[high];
while (low < high&&a[low] <= temp) low++;
a[high] = a[low];
}
a[low] = temp;
return low;
} void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int Parttion2(int a[], int low, int high)
{//将小于等于a[high]的元素移到最前面,最后再将a[high]移到最终位置
int temp = a[high];
int i = low - ;
for (int j = low; j < high; j++)
{
if (a[j] <= temp)
{
i++;
swap(a[i], a[j]);
}
}
swap(a[i + ], a[high]);
return i + ;
}
void QuickSort(int a[], int low, int high)
{
if (low < high)
{
int p = Parttion2(a, low, high);
QuickSort(a, low, p - );
QuickSort(a, p + , high);
}
}
时间复杂度:O(n2)--基本有序或逆序的情况
空间复杂度:O(n)
稳定性:不稳定
平均时间复杂度最好:O(nlog2n)
5.简单选择排序
void SelectSort(int a[], int n)
{
int min;
for (int i = ; i < n-; i++)
{
min = i;
for (int j = i+; j < n; j++)
{
if (a[j] < a[min])
min = j;
}
if (min!=i)
swap(a[min], a[i]);
}
}
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:不稳定
6.堆排序
void AdjustDown(int a[], int k, int n)
{
a[] = a[k]; //a[0]是暂存单元
for (int i = * k; i <= n; i *= )
{
if (i < n&&a[i] < a[i + ]) i++;
if (a[]>=a[i]) break;
else
{
a[k] = a[i];
k = i;
}
}
a[k] = a[];
} void AdjustUp(int a[], int k)
{
a[] = a[k];
for (int i = k / ; i > ; i /= )
{
if (a[i] > a[]) break;
else
{
a[k] = a[i];
k = i;
}
}
a[k] = a[];
} void BuildMaxHeap(int a[], int n)
{
/*for (int i = n / 2; i > 0; i--)
AdjustDown(a, i, n);*/
for (int i = n; i > ; i--)
AdjustUp(a, i);
} void HeapSort(int a[], int n)
{
BuildMaxHeap(a, n);
for (int i = n; i > ; i--)
{
swap(a[], a[i]);
AdjustDown(a, , i - );
}
}
时间复杂度:O(nlog2n)
空间复杂度:O(1)
稳定性:不稳定
c++各种排序的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- javascript排序
利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...
- iOS自定义model排序
在开发过程中,可能需要按照model的某种属性排序. 1.自定义model @interface Person : NSObject @property (nonatomic,copy) NSStri ...
- Lucene4.4.0 开发之排序
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最 ...
随机推荐
- Python_使用smtplib和email模块发送邮件
[http://blog.csdn.net/menglei8625/article/details/7721746] SMTP (Simple Mail Transfer Protocol) 邮件传送 ...
- 【转】 关于data factory的介绍——即如何快速生成大批量数据
上次在我的博客中讲述了quest公司的spotlight系列软件,这次来扯淡一下quest公司的另一测试辅助软件 datafactory(数据工厂),顾名思义,数据工厂是生产数据的,主要应用领域是性能 ...
- VB.NET 小程序 2
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ...
- ruby学习--block
#当前块 class Block def a_method return yield if block_given? 'no block' end end obj=Block.new puts &qu ...
- js概念理解
1.面向对象. 2.函数表达式. 3.递归. 4.闭包. 5.原型链. 6.作用域链. 7.上下文. 8.类. 9.活动对象. 10.w3c规范. 11.设计模式. 12.重构. 13.低耦合,高内聚 ...
- SQL Server 2008 报表服务入门
目录 报表服务的安装与配置 开发报表的过程 报表制作实例 一.报表服务的安装与配置 1. 报表服务的组件 2. 报表服务 2008 的安装 2.1在SQL Server 2008上安装报表服务有两种方 ...
- Memcached 使用
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- python基础:自定义函数
一.背景 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下 ...
- 标识域 Identify Field
在对象中保存DB的ID字段,以维持内存对象和DB数据Row之间的identify. 关系DB使用key来区分数据行. 而内存对象不需要这样的键.因为对象系统能够保证身份确认. 读取时没有问题,但是为了 ...
- (转)mongodb常用命令脚本化-自动化运维
mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护 1 设置副本集 #!/bin/bash#mongodb 进入client ...