各种排序算法C++
各种排序算法


插入排序
直接插入排序
void InsertSort(int arr[], int len) {
int i, j;
int temp;
for (i = 1; i < len; i++) {
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--)
arr[j + 1] = arr[j];
arr[j + 1] = temp;
}
}
插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n−1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n−1)2次,时间复杂度为O(n2),平均的话要比较时间复杂度为O(n2).

shell(希尔)排序
int* shellSort(int* A, int n) {
int step = n/3;
while (step>0) {
if(step == 2)
step = 1;
for (int i=step; i<n; ++i) {
int j = i;
while (j-step>=0 && A[j-step] > A[j]) {
swap(A[j-step], A[j]);
j -=step;
}
}
step /= 3;
}
return A;
}
选择排序
直接选择排序
void selectSort(int* arr, int len){
for (int i = 0; i<len; i++) {
int min = i;
for (int j = i; j<len; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
swap(arr[i], arr[min]);
}
}
堆排序
//堆调整
void HeapAdjust(int arr[], int first, int end){
int father = first;
int son = father * 2 + 1;
while (son < end) {
if (son + 1 < end && arr[son] < arr[son+1])
++son;
if (arr[father] > arr[son])
break;//如果父节点大于子节点则表示调整完毕
else {
swap(arr[father], arr[son]); //不然就交换父节点和子节点的元素
father = son; //父和子节点变成下一个要比较的位置
son = 2 * father + 1;
}
}
}
//堆排序
void HeapSort(int arr[], int len) {
int i;
for (i = len/2 - 1; i >= 0; --i) {
HeapAdjust(arr, i, len); //初始化堆,从最后一个父节点开始
}
for (i = len - 1; i > 0; --i) {
swap(arr[0], arr[i]); //从堆中的取出最大的元素再调整堆
HeapAdjust(arr, 0, i); //调整成堆
}
}
堆排序的时间复杂度最好到最坏都是O(nlogn),较多元素的时候效率比较高
交换排序
冒泡排序
void bubbleSort(int arr[],int len) {
for (int i = 0; i<len; i++) {
for (int j = 1; j<len-i; j++) {
if (arr[j-1] > arr[j]) {
swap(arr[j-1], arr[j]);
}
}
}
}
void bubbleSort2(int arr[],int len) {
for (int i = 0; i<len; i++) {
int flag = 0;
for (int j = 1; j<len-i; j++) {
if (arr[j-1] > arr[j]) {
flag = 1;
swap(arr[j-1], arr[j]);
}
}
if (!flag) break;
}
}
快速排序
int Partition(int arr[], int first, int last) {
int tmp = arr[last];
while (first < last) {
while (first < last && arr[first] <= tmp)
first++;
swap(arr[first], arr[last]);
while (first < last && arr[last] >= tmp)
last--;
swap(arr[first], arr[last]);
}
return first;
}
void quickSortPart(int arr[], int first, int last) {
if (first >= last) return;
int mid = Partition(arr, first, last);
quickSortPart(arr, first, mid - 1);
quickSortPart(arr, mid + 1, last);
}
void quickSort(int arr[],int len) {
quickSortPart(arr, 0, len-1);
}

归并排序


void merge(int arr[], int tmp[], int first, int mid, int last) {
int i = first;
int j = mid+1;
int k = first;
while (i<=mid && j<=last) {
if (arr[i] < arr[j]) {
tmp[k++] = arr[i++];
}
else{
tmp[k++] = arr[j++];
}
}
while (i<=mid) {
tmp[k++] = arr[i++];
}
while (j<=last) {
tmp[k++] = arr[j++];
}
for (i = first; i<=last; i++) {
arr[i] = tmp[i];
}
}
void mergeSortPart(int arr[], int tmp[], int first, int last) {
if (first >= last) return;
int mid = first + (last -first) / 2;
mergeSortPart(arr, tmp, first, mid);
mergeSortPart(arr, tmp, mid+1, last);
merge(arr, tmp, first, mid, last);
}
void mergeSort(int arr[],int len) {
int *tmp = new int[len];
mergeSortPart(arr, tmp, 0, len - 1);
delete [] tmp;
}
桶排序
计数排序
基数排序
各种排序算法C++的更多相关文章
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- Oracle常见故障问题
1. ORA-27102: out of memory 创建pfile文件: create pfile from spfile: 修改pfile文件 修改文件/home/oracle/app/orac ...
- FrameLayout 布局
(一) 1.效果图:颜色一直在改变,实现霓虹灯的效果 2.activity_main.xml <?xml version="1.0" encoding="utf-8 ...
- Http报头Accept与Content-Type的区别(转)
1.Accept属于请求头, Content-Type属于实体头. Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报 ...
- MythXinWCF通用宿主绿色版发布(一键启动,方便快捷)
这是我开发的一款免费的,绿色的WCF宿主工具,一键启动,方便快捷,省去了安装和配置IIS的麻烦,也不需要配置文件. 该工具运行环境为.Net Framework 4.5.1(这个是必装的,win10自 ...
- .net 多文件上传
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.页面 <head runat="server"> <title>上传文件</title> ...
- XSS-Proxy
关于XSS(cross site scripting),相信对此有过研究的人已经感受到了它的“魅力”,权威机构也公布了最近的安全数据,xss已经上升为第二大网络安全隐患: 于此我想通过此文浅析一下xs ...
- 面试题:判断两个字符串是否互为回环变位(Circular Rotaion)
题干: 如果字符串 s 中的字符循环移动任意位置之后能够得到另一个字符串 t,那么 s 就被称为 t 的回环变位(circular rotation). 例如,ACTGACG 就是 TGACG ...
- http://zhidao.baidu.com/link?url=inouJq69pK4PVM2L26fvnxXfRKhJ1uKmttgVqIEqld14SEUa8JzXZfRYHS3qdltqMXBgEQycFsF8AI9DlSoH4_
http://zhidao.baidu.com/link?url=inouJq69pK4PVM2L26fvnxXfRKhJ1uKmttgVqIEqld14SEUa8JzXZfRYHS3qdltqMXB ...
- Yii使用公共函数
在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过程其实更方便. 在入口文件index.php里添加 require_once('protected/function.php'); 即可对其 ...
- Windows内核之线程简单介绍
1 线程定义 <1> 内核对象,操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方 <2>还有一个是线程堆栈.它用于维护线程在运行代码时须要的全部函数參数 ...
