1.直接插入排序
每一趟将一个待排序的元素作为关键字,按照其关键字的大小插入到已经排好的部分序列的适当位置上。平均时间复杂度为O(n2),空间复杂度为O(1)。
void InsertSort(int R[], int n)
{
if (R == nullptr || n<=0)
return;
int i, j;
int temp;
for (i = 1; i < n; ++i)
{
j = i - 1;
temp = R[i];
while (j >= 0 && R[j] > temp)
{
R[j+1] = R[j];
--j;
}
R[j+1] = temp;
}
}
2.冒泡排序
平均时间复杂度为O(n2),空间复杂度为O(1)
void BubbleSort(int R[], int n)
{
if (R == nullptr || n <= 0)
return;
int i, j;
int temp;
int flag = 0;
for (i = n; i >= 1; --i)
{
flag = 0;//每次重新置为0
for (j = 1; j < i; ++j)
{
if (R[j - 1] > R[j])
{
temp = R[j];
R[j] = R[j - 1];
R[j - 1] = temp;
flag = 1;//有数据交换,flag=1;
}
}
if (flag == 0)
return;
}
}
3.快速排序
快速排序以枢轴为中心,将序列分成两部分。关键是枢轴的划分。
时间复杂度:最好的情况下为O(nlogn),最坏为O(n2)
空间复杂度:O(log2n)
递归算法:
void QuickSort(int R[], int low, int high)