目录
1.冒泡排序
最坏情况:完全逆序,时间复杂度:
最好情况:顺序有序,
稳定性:稳定
源码:
void BubbleSort(int* a, int n)
{
for (int j = 0; j < n; j++)
{
bool st = false;
for (int i = j; i+j < n; i++)
{
if (a[i - 1] > a[i])
{
swap(a[i - 1], a[i]);
st = true;
}
}
if (!st)
{
break;
}
}
}
2.插入排序(直接插入排序)
最坏情况:完全逆序,时间复杂度:
最好情况:顺序有序,
稳定性:稳定
源码:
void Insertsort(int* a, int n)
{
for (int i = 0; i + 1 < n; i++)
{
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
3.希尔排序(缩小增量排序)
3.1预排序(让数组接近有序)
3.2插入排序
稳定性:不稳定
预排序:
gap越大,大的数字可以越快跳到后面,小的数字可以越快跳到前面,越不接近有序。
gap越小,大的数字可以越慢跳到后面,小的数字可以越慢跳到前面,越接近有序。
当gap为1,相当于插入排序。
源码:
void shellsort(int* a, int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3+1;//有研究表明,除3合适 ,加1保证最后gap一定为1
//gap>1预排序
//gap==1插入排序
for (int j = 0; j < gap; j++)
{
for (int i = j; i + gap < n; i += gap)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
}
本篇完