插入排序
分为:直接插入排序和希尔排序
直接插入排序
思想: 将元素插入有序数组中,与选择排序不同,插入排序的时间取决于数组中元素的初始顺序
#include<iostream>
using namespace std;
void Insert(int* a, int n)
{
int t;
for (int i = 0; i < n; i++)
{
for (int j = i - 1; j >= 0; j--)
{
if (a[i] < a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
int main()
{
int a[] = { 12, 2, 3, 43, 5, 46, 74, 28, 30, 19, 11, 9 };
int n = sizeof(a) / sizeof(int);
Insert(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
方法二:交换N次来实现插入排序
#include<iostream>
using namespace std;
void Insert(int* a, int n)
{
int t;
for (int i = 0; i < n; i++)
{
int min = i;
int v = a[i];
for (int j = i - 1; j >= 0; j--)
{
if (v < a[j])
min = j;
}
for (int k = i; k > min; k--)
{
a[k] = a[k - 1];
}
a[min] = v;
}
}
int main()
{
int a[] = { 12, 2, 3, 43, 5, 46, 74, 28, 30, 19, 11, 9 };
int n = sizeof(a) / sizeof(int);
Insert(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
插入排序和选择排序,运行时间都是平方级的。
希尔排序
思想:使数组的任意间隔为h的元素都是有序的。
根据长度为N的数组,来找出最大间隔的h,然后递归的减少h直到h=1。
h的选择没有固定标准。
#include<iostream>
using namespace std;
void Insert(int* a, int n,int dk)
{
int t;
for (int i = 0; i < n; i++)
{
for (int j = i - dk; j >= dk - 1; j -= dk)
{
if (a[i] < a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
void ShellSort(int* a, int n)
{
int dk = 1;
while (dk < n / 3)
dk = dk * 3 + 1;
while (dk > 0)
{
Insert(a, n, dk);
dk = dk / 3;
}
}
int main()
{
int a[] = { 12, 2, 3, 43, 5, 46, 74, 28, 30, 19, 11, 9 };
int n = sizeof(a) / sizeof(int);
ShellSort(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
希尔排序适合大型数组,比插入和选择要快很多,数组越大,优势越大,它的运行时间达不到平方级。