排序算法:
十种比较经典的排序算法:冒泡,选择,插入,希尔,堆,快速,归并,计数,基数,桶。每种算法在一定环境下各有各的优越性,需要根据数据的分布状况进行合理选择。但在笔面试需要掌握快排(上限)和冒泡(下限)两种,如果你情况不错,考你快排不过分吧;如果你状态不太行,考你冒泡总要会吧?
排序算法的稳定性:
当待排序的数据中有相同的数据,排序算法是否会更改它们的前后关系,不会更改的叫稳定排序,可能会更改的叫不稳定排序。
冒泡:
特点:对数据的有序性敏感
是否稳定:稳定
平均时间复杂度: O(n^2)
空间复杂度:O(1)
void bubble_sort(int* arr,size_t len)
{
bool flag = true;
for(int i=len-1; i>0 && flag; i--)
{
flag = false;
for(int j=0; j<i; j++)
{
if(arr[j] > arr[j+1])
{
swap(arr[j],arr[j+1]);
flag = true;
}
}
}
}
选择:
特点:数据的交换次数少,如果待排序的数据字节较多,选择排序是一个不错的方案。
是否稳定:不稳定
平均时间复杂度:O(n^2)
空间复杂度:O(1)
void select_sort(int* arr,size_t len)
{
for(int i=0; i<len-1; i++)
{
int min = i;
for(int j=i+1; j<len; j++)
{
if(arr[j] < arr[min])
min = j;
}
if(min != i)
swap(arr[min],arr[i]);
}
show_sort_result(__func__,arr,len);
}
插入:
特点:数据的交换次数少,适合对有序的数据添加新的数据。
是否稳定:稳定
平均时间复杂度:O(n^2)
空间复杂度:O(1)
void insert_sort(int* arr,size_t len)
{
for(int i=1,j; i<len; i++)
{
int tmp = arr[i];
for(j=i-1; j>=0 && tmp<arr[j]; j--)
{
arr[j+1] = arr[j];