直接插入排序:O(N2)
void InsertSort(int *a, int size)
{
for (int i = 0; i < size - 1; i++)
{
for (int j = i + 1; j > 0; j--)
{
if (a[j] < a[j - 1])
{
int tmp = a[j - 1];
a[j - 1] = a[j];
a[j] = tmp;
}
}
}
}
冒泡排序:O(N2)
void BubbleSort(int *a, int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 1; j < size-i; j++)
{
if (a[j] < a[j - 1])
{
int tmp = a[j - 1];
a[j - 1] = a[j];
a[j] = tmp;
}
}
}
}
希尔排序 O(N2) 设置步长,优化后的插入排序
void ShellSort(int *a, int size)
{
int gap = size / 2;
while (gap >= 1)
{
for (int i = 0; i < size; i ++)
{
for (int j = i + gap; j<size; j = j - gap)
{
if (a[j] < a[j - gap])
{
int tmp = a[j - gap];
a[j - gap] = a[j];
a[j] = tmp;
}
break;
}
}
gap = gap / 2;
}
}
简单选择排序 O(N2)
void SelectSort(int *a,int size)
{
for (int i = 0; i < size; i++)
{
for (int j = i + 1; j < size; j++)
{
if (a[j] < a[i])
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}
快速排序 logN
void QuickSort(int *a, int size)
{
if (size <=1)
return;
//哨兵i 哨兵j
int first_val = a[0];
int i = 1, j = size - 1;
while (i != j)
{
//哨兵j开始行动
while (j > i && a[j] >= first_val)
{
j--;
}
while (j > i && a[i] < first_val)
{
i++;
}
if(i<j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
/*for (int k = 0; k < size; k++)
{
std::cout << a[k] << std::endl;
}
std::cout << "\n";*/
}
if (a[0] > a[j])
{
int tmp = a[0];
a[0] = a[j];
a[j] = tmp;
}
for (int k = 0; k < size; k++)
{
std::cout << a[k] << std::endl;
}
std::cout << "\n";
QuickSort(a, i);
//这里很重要
if(i==1)
QuickSort(a+i, size-i);
else
QuickSort(a + i + 1, size - i - 1);
}
原文:https://www.cnblogs.com/shawnc24/p/10405646.html