直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
一、直接插入排序
稳定,时间复杂度:最好O(n)、最差O(n^2)、平均O(n^2)。空间复杂度O(1)
void InsertSort(int L[], int n)
{
int i, j,key;
for (i = 1; i<n; i++)
if(L[i] < L[i-1])//须要将L[i]插入到有序表L[0...i-1]
{
key = L[i];
for(j = i-1; j >= 0 && key < L[j]; j--)//后移
L[j+1] = L[j];
L[j+1] = key;//插入到正确位置
}
}
二、二分插入排序
查找插入位置时使用二分查找。稳定。最佳情况O(n lg n),最差和平均情况O(n^2),空间复杂度O(1)。
void BInsertSort(int L[], int n)
{
int i, j,key, low, mid, high;
for (i = 1; i < n; i++)
{
key = L[i];
low = 0; high = i-1;
while(low <= high)//在有序的L[low,...,high]中折半查找有序插入的位置
{
mid = (low+high)/2;
if(key < L[mid])
high = mid - 1;
else
low = mid + 1;
}
for (j = i-1; j>=high+1;j--)//后移 //j >= low
L[j+1] = L[j];
L[high+1] = key;//插入key //L[low] = key
}
}
三、希尔排序
不稳定,时间复杂度在理想情况下是O(nlgn),最坏情况为O(n^2)。空间复杂度O(1)
void ShellSort(int L[], int n)
{
int gap = n,i, j, tmp;
int k1=0, k2;
while (gap > 1)//一趟shell排序
{
k1++;k2=0;
gap = gap/3+1;
for(i = gap; i < n; i++)
if(L[i] < L[i-gap])
{
k2++;
tmp = L[i];
for(j = i-gap;j>=0 && tmp < L[j]; j -= gap)
L[j+gap] = L[j];
L[j+gap] = tmp;
//printf("gap=%d,%d_%d: ",gap,k1, k2);Print(L, n);
}
}
}
四、冒泡排序
稳定,时间复杂度最好O(n),最坏和平均情况为O(n^2)。空间复杂度O(1)。
void BubbleSort(int L[], int n)
{
bool exchange;
int i, j;
for(i = 0; i < n; i++)
{
exchange = false;
for(j = n-1; j >i; j--)
if(L[j] < L[j-1])//这里是小的数往上一直交换
{
std::swap(L[j], L[j-1]);
exchange = true;
}
if(!exchange)
break;
}
}
双向冒泡排序:
//改进版的冒泡排序(双向冒泡)
void bidBubbleSort(int a[], int n)
{
int left, right, t, l, r, j, i = 0;
left =0;
right = n -1;
//双向冒泡算法,极大的降低了循环排序的次数
while(left < right)
{
//必需要给l和r赋值,否则若数组一開始就有序,则right=r中的r未赋值。即报错
l = left + 1;
r = right -1;
//第一次循环将最大的值放到末尾
for(j = left; j < right; j++)
{
if(a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
r = j;
}
}
right = r;
//第二次循环将最小的值放到了开头
for(j = right; j > left; j--)
{
if(a[j] < a[j - 1])
{
t = a[j];
a[j] = a[j - 1];
a[j - 1] = t;
l = j;
}
}
left = l;
printf("第%d次排序结果:", i + 1);
i++;
for(j = 0; j < n; j++){
printf("%d\t", a[j]);
}
}
printf("终于排序结果: ");
for(j = 0; j < n; j++){
printf("%d\t", a[j]);
}
}
五、简单选择排序
不稳定。时间复杂度O(n^2)。
空间复杂度O(1)。
void SlectSort(int L[], int n)
{
int i, j, index;
for(i = 0; i < n-1; i++)
{
index = i;
for(j = i+1; j < n; j++)
if(L[j] < L[index])
index = j;
if(index != i)
std::swap(L[i], L[index]);
}
}
參考:http://blog.csdn.net/han_xiaoyang/article/details/12163251#t128
版权声明:本文博客原创文章。博客,未经同意,不得转载。
直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序的更多相关文章
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现
之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序
C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...
- python算法(一)基本知识&冒泡排序&选择排序&插入排序
本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
- C语言实现 冒泡排序 选择排序 希尔排序
// 冒泡排序 // 选择排序 // 希尔排序 // 快速排序 // 递归排序 // 堆排序 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h& ...
- 数据结构和算法(Golang实现)(20)排序算法-选择排序
选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...
- 选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 排序算法--选择排序(Selection Sort)_C#程序实现
排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
随机推荐
- Nubia Z5S 基于官方H207/4.4内核的Mokee4.4.4 RC3.2 (2014.7.31修复呼吸灯(能亮依旧不能呼吸))
特别感谢 yun3195 和 轻描淡写Yhw 帮忙測试 转帖请务必注明本链接地址: http://blog.csdn.net/syhost/article/details/36444259 此ROM ...
- python web
[root@xen202 wbk]# python -m SimpleHTTPServerServing HTTP on 0.0.0.0 port 8000 ...
- WPF入门介绍
Windows Vista已经于2007年1月30正式发行零售版本,安装Vista的计算机将会大量出现.在Vista时代,身为编程员,就一定要具备Vista桌面应用开发的能力.而开发Vista桌面应用 ...
- 【MFC两种视频图像採集方法】DirectShow与Opencv
效果图: DirectShow採集核心代码: 创建线程调用该函数,採集图像通过x264解码封装rtmp协议包.推送至FMSserver,可实现视频直播 UINT __stdcall StartVide ...
- hnnu 11546 Sum of f(x) (求一个数的全部约数和)
代码: #include<cstdio> #include<cstring> #define N 200000 using namespace std; long long f ...
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- Ubuntu下Chromium源码的编译
一.失败的经历 印象中,谷歌建议Ubuntu建议版本为10.4.但是我找不到出处了,模糊的印象.不知道是不是这样? 1.Ubuntu10.4.3-desktop-amd64 + Virtual Box ...
- CString的部分实现剖析
一.CString初探: 在CString的实现中,其最基础的类结构如下: CString其实只有一个数据成员m_pszData,这个成员指向了字符串的首地址.但在MFC的具体实现中, m_pszDa ...
- HDU 1231:最大连续子序列(DP)
pid=1231">最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- ios 6 横竖屏转换
xcode 版本4.5 模拟器:6.0 项目需求:刚进去界面横屏,从这个界面进去的界面全是竖屏. 程序的根控制器用了UINavigationController.下面是代码: 1.在appde ...