排序
基本概念
排序的目的就是为了让查找效率变得更高。
排序算法的稳定性
指的是关键字相同的元素之间在排序完成后相对位置不发生改变。
1)不稳定算法
2)有些算法可以稳定,但通过微调代码也可以不稳定。
内部排序
在排序过程中,待排序的数据全部被载入在内存中;
外部排序
由于数据过多,导致待排序的数据只能部分载入在内存中,在排序过程中会有内存和磁盘之间的数据交换;(减少磁盘的读写次数)
两种基本操作:
比较、移动。
直接插入类排序
算法思想:
每次将一个记录按照其关键字的大小插入到已经排好的序列中,直至全部记录插入完毕。
例如:
int arr[]={
16,1,45,23,99,2,18,67,42,10};---{
1,16,....}---{
1,16,45,....}
---{
1,16,23,45,.....}---{
1,16,23,45,99}---{
1,2,16,23,45,99}
---{
1,2,16,18,23,45,99,....}---{
1,2,16,18,23,42,45,99,...}
---{
1,2,10,16,18,23,45,67,99}---{
1,2,10,16,18,23,42,45,67,99}
空间复杂度: O ( 1 ) O(1) O(1)。
时间复杂度:最好情况: O ( n ) O(n) O(n),最坏情况: O ( n 2 ) O(n^2) O(n2),平均复杂度: O ( n 2 ) O(n^2) O(n2)。
是一种稳定排序算法
适合待排序数量比较少
实现代码:
#include<iostream>
using namespace std;
//直接插入排序
template <typename T>//T代表数组元素类型
void InsertSort(T myarray[], int length)
{
if (length <= 1)
{
return;
}
for (int i = 1; i < length; i++)//从第二个元素开始比较
{
if (myarray[i] < myarray[i - 1])
{
T temp = myarray[i];//暂存myarray[i],防止后续移动元素时值被覆盖掉
int j;
for (j = i -