直接插入排序:稳定排序 时间复杂度 O(n2

void insertSort(int data[], int N){if(N < 2) return;for(int i = 1; i< N; ++i){int temp = data[i];int j = i-1;while(j>=0 && data[j] > temp){data[j+1] = data[j];--j;}if(j != i-1)data[j+1] = temp;}}

View Code

二分法插入排序:稳定排序 O(n2

void binSort(int data[], int N){if(N < 2) return;int left, right, mid;for(int i = 1; i< N; ++i){int temp = data[i];left = 0; right = i-1;while(left <= right){mid = left>>1 + right>>1 ;if(temp < A[mid])right = mid - 1;elseleft = mid + 1;}for(int j = i-1; j >= left ; --j)A[j+1] = A[j];if(left != i)data[left] = temp;}}

View Code

希尔排序: 不稳定排序 O(n1.3)

//N data 的大小
//对于希尔排序,数据必须采用顺序存储的方式
void shellSort(int data[], unsigned int N)
{if(N < 2) return ;int increment = N>>1; //还有一种初始值为(N-1)/ 3//多个区段的直接插入排序for(; increment > 0; increment = increment >>1){for(int i = increment ; i< N; ++i){int temp = data[increnment];int j = i- increment;while(j>= 0 && data[j]>temp){data[j+increment] = data[j];j -= increment;}data[j+increment] = temp;}}}

选择排序: 不稳定排序(因为在选择好后的交换过程中可能会打乱相应的顺序)   O(n2)

void selectSort(int data[], int N)
{if(N < 2) return ;for(int i = 0; i< N-1; ++i){int k = i;for(int j = i+1; j < N; ++j){if(data[j] <data[k])k = j;if(k != i){int temp = data[k];data[k] = data[i];data[i] = temp;}    }
}

堆排序: 不稳定(内部交换略乱 无法保证稳定) O(nlogn) 初始数据的排列对于工作效率没有太大影响 (选择排序大类)

//数据存储为1.。。n
void BuildMaxHeap(int A[], int n)
{for(int i = n>>1 ; i>0; --i)adjustDown(A, i,n);}
void adjustDown(int A[], int k, int n)
{A[0] = A[k];int child = k*2;while(child <= n){if(child < n && A[child+1] > A[child])++child;if(A[child] > A[0]){A[k] = A[child];k = child;child = k*2;}elsebreak;}    A[k] = A[0];
}//数据存储为1.。。n
void HeapSort(int A[], int n)
{BuildMaxHeap(A, n);for(int i = n; i >0; --i){swap(A, 0, i);adjustDown(A, 0, i-1);}
}

冒泡排序:稳定排序   稳定

void bubbleSort(int A[], int n)
{if(n < 2) break;for(int k = 0; k < n-1; k++){bool no_swap = true;for(int i = 0; i < n-1-k; ++i){if(A[i] > A[i+1]){int temp = A[i];A[i] = A[i+1];A[i+1] = temp;no_swap = false;}}if(no_swap == true) break;}
}

快排:最坏情况 O(n2) 一般 O(nlogn) 不稳定  对于排好序的比较次数为n2/2

void quickSort(int A[], int left, int right)
{if(left == right) return ;int i = left;int j = right;temp = A[i];while(i != j){while(A[j] >= temp && i<j)--j;if(i<j) A[i++] = A[j];while(A[i] < temp && i<j)++i;if(i < j) A[j--] = A[i];}A[i] = temp;quick(A, left, i-1);quick(A, i+1, right);
}

快排非递归实现

int partion(vector<int> &data, int low, int high){int pivot = data[low];while(low < high){while(low<high && data[high] >= pivot) --high;if(low < high)data[low++] = data[high];while(low < high && data[low] < pivot) ++low;if(low <high)data[high--] = data[low];}data[low] = pivot;return low;
}void qsort(vector<int> &data, int low, int high){assert(low < high);stack<int> s;s.push(low);s.push(high);while(!s.empty()){high = s.top();s.pop();low = s.top(); s.pop();mid = partion(data,low, high);if(low < mid -1){s.push(low);s.push(mid-1);}if(mid+1 < high){s.push(mid+1);s.push(high);}}
}

归并排序:稳定排序 辅助空间 O(n) 时间复杂度 O(nlogn)

void merge(int A[], int AA[], int low, int mid, int high)
{int i, j, k;i = low; j = mid +1; k = low;while(i <= mid && j <=high){if(A[i] <= A[j])AA[k++] = A[i++];elseAA[k++] = A[j++];}while(i <= mid) AA[k++] = A[i++];while(j <= high) AA[k++] = A[j++];
}
void mergePass(int A[], int AA[], int n, int length)
{int i = 0;while(i < n- length*2){merge(A, AA, i, i+length-1, i + 2*length -1);i+= 2*length;}if(i + length -1 < n-1)merge(A, AA, i, i+length-1, n-1);else{for(; i< n; ++i)AA[i] = A[i] ;}
}void mergeSort(int A[], int n)
{int *AA = new int[n];int length = 1;while(length < n){mergePass(A, AA, n, length);length >>= 1;mergePass(AA, A, n, length);length >>=  1;    }
}

转载于:https://www.cnblogs.com/graph/p/3015476.html

排序算法_总结与复习相关推荐

  1. python语言基本排序算法_排序算法(Python)

    参考: <数据结构(Python 语言描述)> - 3.4 基本排序算法.3.5 更快的排序 Tips:为了保持简洁,每个函数都只处理整数列表,并且假设列表不为空. 目录.jpg 术语 1 ...

  2. python常见的排序算法_常见排序算法之python实现

    1. 冒泡排序 时间复杂度为O(n^2), 稳定的排序算法 思路:一开始比较的区间是[0,n-1],依次比较相邻两数,哪个数大哪个数就放在后面,这样一次遍历数组后,最大的数会在数组的最后一个位置,然后 ...

  3. 希尔排序是一种稳定的排序算法_全面解析十大排序算法之四:希尔排序

    点击上方蓝字关注我们吧 1. 十种排序算法的复杂度和稳定性 时间复杂度:一个算法消耗所需要的时间 空间复杂度:运行一个算法所需要的内存时间 稳定性:如一个排列数组:1.4.5.6.4.7. 此时有一对 ...

  4. 木桶排序算法_这才是你想要桶排序

    前面说的 昨天发的桶排序文章,有同学回复,确实有比较精明的同学,文章就是想提出一个比较简单的思路,本来想给自己的排序方式写个名字叫做"木桶排序",这篇文章讲解真正的桶排序,结合前面 ...

  5. java shell排序算法_【算法】8种排序算法(Java)

    排序算法 上一篇博客中写到了关于动态规划中一些常见的问题和解决方案,根据问题总结出来解决动态规划类问题的方法是通过寻找状态,列出状态转移方程,通过遍历即可将问题解决.排序也是一类常见的问题,通过排序的 ...

  6. 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算

    对于排序算法而言,有几个重要的点: 理解此种排序算法是怎么运行的 理解算法的时间复杂度与空间复杂度计算 递推公式(关乎时间复杂度的计算) 递推公式主要为以下的形式(递归使用的复杂度也这么算): 具体推 ...

  7. 排序算法_桶排序(箱排序)

    一.算法描述 假设有一组长度为N的待排关键字序列K[1....n]. 首先将这个序列划分成M个的子区间(桶). 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) , ...

  8. python实现排序算法_数据结构之(3)python实现排序算法

    常用排序与插入算法 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直 ...

  9. java常见的排序算法_常见排序算法及Java实现

    先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...

最新文章

  1. 如何提高还在用window系统的编码硬效率
  2. java geom_java.awt.geom 类 Area - Java 中文参考手册
  3. binaryoperator java_BinaryOperatorT接口的用法示例
  4. 对.NET的GC(垃圾回收)的理解都存在错误认识
  5. 用Java获取vSphere相关数据
  6. 如何利用机器学习进行海量数据挖掘
  7. springboot之整合mybatis
  8. 解析oracle的dump文件,使用awk来解析dump文件
  9. vue3 ts 手动封装message消息组件
  10. 【有限元分析】圣维南原理
  11. windows7计算机不显示u盘,Win7系统U盘文件不显示的三种解决方法
  12. (struct)结构体变量作为函数参数调用的方法小结
  13. oracle sys_lob$$清理,清理 oracle lobsegment
  14. PHP 实现身份证号实名认证功能
  15. 记录ant design vue a-select Form编辑时回显数据库数据为value而不是label的问题
  16. 股票K线统计,各个分钟线,日线,周线统计,sql示例
  17. Debug:ValueError: malformed node or string
  18. python编程 迷你世界_迷你世界迷你编程下载
  19. 相对论到底说了些什么,你也能看懂
  20. java电影票选座_Android自定义view实现电影票在线选座功能

热门文章

  1. 散酒到底多少钱才是纯酿的
  2. 打造网红内容和资本哪个更重要
  3. 初步看,我要在公司赚取更多的工资,钱多活少离家近
  4. 不是每个人的一生都会有贵人相助
  5. 七类常见的兼职骗局,你需要知道
  6. TCP 粘包、半包 Netty 全搞定
  7. 32位和64位操作系统,二者有何区别?是否64位更快?
  8. 分布式理论(3):Paxos Made Simple
  9. access mysql 同步,SQLServer2008 同步Access数据库
  10. 学习SQL:使用日期和时间函数创建SQL Server报表