1 插入排序 插入排序是很基本的排序,特别是在数据基本有序的情况下,插入排序的性能很高,最好情况可以达到O(N),其最坏情况和平均情况时间复杂度都是 O(N^2)
>#include<iostream>
#include <iterator>
using namespace std;
/* 算法思路, 从第二个数开始,循环向前交换比较,一直到最后一个数比较完成,排序即完成*/
void insert_sort(int a[], int n)
{
int i, j;
for(i = 1; i< n; i++)
{
int key = a[i];
int key_pos = i;
for(int j = i-1; j >=0 && j!=i ; j--)
{
if(a[j] > key)
{
a[key_pos] = a[j];
a[j] = key;
key_pos = j;
}
}
}
}
int main()
{
int a[] = {3,2,1,5,6,4};
insert_sort(a, sizeof(a)/sizeof(int));
for(int i= 0; i< sizeof(a)/sizeof(int); i++)
{
cout<<a[i]<<" ";
}
return 0;
}
2 冒泡排序 泡排序时间复杂度跟选择排序相同。其思想就是进行 n-1 趟排序,每次都是把最小的数上浮,像鱼冒泡一样。最坏情况为 O(N^2)。
3 并归排序 归并排序通过分治算法,先排序好两个子数组,然后将两个子数组归并。时间复杂度为 O(NlgN)。 基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序
4 选择排序 基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序,时间复杂度为O(n2)
5 快速排序 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的,算法复杂度为NLogN
6 堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法。大顶堆的根节点是二叉树中最大的节点,每次操作提取此最大节点,完成排序。算法复杂度为NLogN
- 二分查找(折半查找) 元素必须是有序的。而且是顺序存储结构。基本思想:将目标元素与位于(1+n)/2位置的元素相比较,如果小于就在小于(1+n)/2的子表中继续上述操作,如果大于,就在大于中间值的子表中查找。时间复杂度:O(logn)