常见的排序算法
来源:互联网 发布:淘宝脸部验证 编辑:程序博客网 时间:2024/05/29 03:59
排序算法是面试笔试中必定要涉及的内容,常见的排序算法有:插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等,下面是我自己针对这几种算法进行一些总结和实现。
(1)按照时间性能来分,可以划分为三类排序算法:
1. O(nlogn): 快速排序,堆排序,归并排序,其中以快排为最佳;
2. O(n2): 直接插入排序,冒泡排序,简单选择排序,其中以直接插入排序为最佳,尤其对于那些关键字近似有序的记录序列;
3. O(n): 只有基数排序,基数排序适合n值很大而关键字较小的序列。
(2)性能易变性:
当待排序列有序时,直接插入排序和冒泡排序能到达O(n),而对于快速排序而言,这反而是最不好的情况,此时时间性能蜕化为O(n2);简单选择排序,堆排序和归并排序的时间复杂度不随数列中关键字的分布
而改变。
(3)稳定性:
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,
冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
各排序时间复杂度和空间复杂度对比表:
平台:VS 2008
算法实现:
---------------插入排序(直接插入)--------------
#include "stdafx.h"
#include "stdio.h"
#define LEN 10
void sort_insert(int a[],int len)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
---------------冒泡排序--------------
#include "stdafx.h"
#include "stdio.h"
#define LEN 10
void bubble_sort(int arry[],int len)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
---------------选择排序(简单选择排序)--------------
#include "stdafx.h"
#include "stdio.h"
#define LEN 10
//交换数组中的两个数
void swap(int v[],int i,int j)
{
}
//选择排序算法
void selection_sort(int arry[],int len)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
---------------快速排序--------------
#include "stdafx.h"
#include "stdio.h"
#define LEN 10
//交换数组中的两个数
void swap(int v[],int i,int j)
{
}
//快速排序算法
void quick_sort(int v[],int left,int right)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
算法具体执行过程:
举例:a[6] = {3,6,2,5,0,4,7};
选定中间元素(0+6)/2 = 3,即a[3]为5:
3 6 2 5 0 4 7
把5与left互换;
5 6 2 3 0 4 7
left和last都指向5;
i从left + 1开始,即从6开始;
如果小于a[left]内的数,则和++last互换,否则不执行操作;
执行过程如下:
5 6 2 3 0 4 7
5 2 6 3 0 4 7
5 2 3 6 0 4 7
5 2 3 0 6 4 7
5 2 3 0 4 6 7
5 2 3 0 4 6 7
最后交换left和last,此时last指向的是4
4 2 3 0 5 6 7
最终一次快排结果为:{4,2,3,0} 5 {6,7}
然后在{4,2,3,0}和{6,7}两个集合中递归快排
---------------堆排序--------------
#include "stdafx.h"
#include "stdio.h"
#define LEN 10
//调整筛选
void shift(int h[],int n,int m)
{
}
//堆排序
void HeapSort(int p[],int n)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
---------------希尔排序--------------
/#include "stdafx.h"
#include "stdio.h"
#define LEN 10
void shellSort(int a[],int n)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
----------------------相关链接--------------------------
链表与时间复杂度O:
a.归并两个链表(有序)时,采用快速排序,时间复杂度为O(nlogn);
b.单链表,双链表插入和删除元素的时间复杂度都为O(n);
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- Xcode6以后mac中iOS模拟器安装路径以及程序沙箱路径
- postgres学习问题之select语句
- UIAutomator源码分析之启动和运行
- html中的图片格式
- Struts2:过滤器和拦截器的区别
- 常见的排序算法
- thinkphp 数据库设置前缀问题 联合查询
- jquery closest()方法
- CocoaPod的安装和使用
- 关于强制转化后的风险
- 嵌入式linux系统网络配置
- 数学公式对应的markdown代码
- UVA - 11039 Building designing
- c语言中左移问题