各种排序算法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描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- Spinner控件:Spinner绑定的监听是SetOnItemSelectedListener
(一) 1.效果图:ArrayAdapter可以不用设置 arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_it ...
- NSPredicate 谓词总结 数组过滤 模糊匹配
NSPredicate 用于指定过滤条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配. NSPredicate常用方法介绍 1.创建NSPredicate(相当于创建一个过滤条件 ...
- JNI之Hello World!
基本流程: 1. 创建一个类(HelloWorld.java)2. 使用 javac 编译该类3. 利用 javah -jni 产生头文件4. 用本地代码实现头文件中定义的方法5. Run 备注:在一 ...
- Ubuntu 16.04通过源码安装QUEM虚拟机
下载编译安装: wget http://download.qemu-project.org/qemu-2.9.0.tar.xz tar xvJf qemu-2.9.0.tar.xz cd qemu-2 ...
- 【译】PHP中的Session及其一些安全措施
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...
- Delphi~通过程序窗体句柄获取程序路径
http://www.cnblogs.com/Jesses/articles/1636323.html 引用PsAPI var h:HWND; pid: Cardinal; pHandle: T ...
- [HTML/CSS]uploadify自定义按钮样式
概述 在项目中经常用到uploadify上传插件,但是FLASH按钮的外观往往跟我们网页的设计的主题色不太搭配.这时就需要对其样式进行修改. 样式文件是uploadify.css. 打开这个文件后,你 ...
- Invalidate、RedrawWindow与UpdateWindow的差别
一:什么时候才会发生重绘窗体的消息? 当须要更新或又一次绘制窗体的外观时,应用程序就会发送WM_PAINT消息. 对窗体进行又一次绘制. 二:Invalidate() -- RedrawW ...
- Laravel 5系列教程六:表单 Forms
免费视频教程地址https://laravist.com/series/laravel-5-basic 在开始之前,我们把界面先美化一点点先: 首先到https://github.com/JellyB ...
- Hadoop之Hbase详解
1.什么是Hbase HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统, hbase是列式的分布式数据库 1.2.HBASE优势: 1)线性扩展,随着数据量增多可以通过节点扩展进行支撑 ...
