各种排序算法

插入排序

直接插入排序

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++的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  10. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

随机推荐

  1. UWP 程序抛出异常时总是跳到“global::System.Diagnostics.Debugger.Break();”的解决办法

    调试 C# 程序时,如果遇到异常,VS 会中断,指出导致异常的语句.但是最近调试 UWP 程序时,发现总是在“global::System.Diagnostics.Debugger.Break();” ...

  2. Saga的实现模式——进化(Saga implementation patterns – variations)

    在之前的几个博客中,我主要讲了两个saga的实现模式: 基于command的控制者模式 基于事件的观察者模式 当然,这些都不是实现saga的唯一方式.我们甚至可以将这些结合起来. 发布者——收集者 回 ...

  3. 常用 ARM 指令集及汇编

    ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...

  4. iOS 中json解析数据出现中文乱码的问题

    一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢 ...

  5. Session集中式管理

          Asp.net Session集中式管理主要有StateServer(状态服务器).Sqlserver(数据库服务器).自定义(如Redis缓存服务器)等,本文主要介绍StateServe ...

  6. htmltestrunner解决错误日志出界问题

    扩大背后的区域放大,让它看起来没有出界 .popup_window {    display: none;    position: relative;    left: 0px;    top: 0 ...

  7. 【Sofa】Sofa比赛成绩记录

    最高得到过第4名,然后后面跌倒了第7名,现在追到了第6名.虽然名次还不是最高,但是很开心,今天能在一道一直困扰的题目上有突破,就是那个自行车预测的题目,开始过拟合了.后面进行了一些处理,效果很明显.继 ...

  8. LWIP的移植笔记

    第一次发表博客,文章摘录于还不懂同学的专栏 lwIp的作者做了大量的工作以方便像我这种懒人移植该协议栈,基本上只需修改一个配置头文件和改写3个函数即可完成lwIP的移植.要改写的函数位于lwIP-1. ...

  9. 一天干掉一只Monkey计划(一)——基本光照模型及RT后处理 【转】

    http://www.cnblogs.com/Zephyroal/archive/2011/10/10/2206530.html 一天干掉一只Monkey计划(一)——基本光照模型及RT后处理 1, ...

  10. linux下confstr与uname函数_获取C库与内核信息

    #include <stdio.h> #include <sys/utsname.h> //uname int main(int argc, char **argv[]) { ...