daklqw 2019-06-28
排序算法应该算是我们最熟悉的算法了,我们学的第一个算法,可能就是排序算法,而在实际应用中,排序算法也经常会被用到,其重要作用不言而喻。
经典的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。按照时间复杂度,可以分为以下三类。





// O(n^2)
void Bubble_Sort(float data[], int n)
{
int i = 0, j = 0;
int temp = 0;
int flag = 0;
for(i = n-1; i > 0; i--)
{
flag = 0;
for(j = 0; j < i; j++)
{
if(data[j+1] < data[j])
{
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
flag = 1;
}
}
if(!flag)//If no data needs to be exchanged, the sort finishes.
{
break;
}
}
}

// O(n^2)
void Insertion_Sort(float data[], int n)
{
int i = 0, j = 0;
int temp = 0;
for(i = 1; i < n; i++)
{
temp = data[i];
for(j = i; j > 0; j--)
{
if(temp < data[j-1])
{
data[j] = data[j-1];
}
else// The data ahead has been sorted correctly.
{
break;
}
}
data[j] = temp; // insert the data
}
}
// O(n^2)
void Selection_Sort(float data[], int n)
{
int i = 0, j = 0, k = 0;
int temp = 0;
for(i = 0; i < n-1; i++)
{
k = i;
for(j = i+1; j < n; j++)
{
if(data[j] < data[k])
{
k = j;
}
}
if(k != i)
{
temp = data[i];
data[i] = data[k];
data[k] = temp;
}
}
}交换排序和插入排序的时间复杂度都为 $O(n^2)$,也都是原地排序算法,为什么插入排序更受欢迎呢?
冒泡排序中数据的交换操作:
if (a[j] > a[j+1]) { // 交换
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = true;
}
插入排序中数据的移动操作:
if (a[j] > value) {
a[j+1] = a[j]; // 数据移动
} else {
break;
}
获取更多精彩,请关注「seniusen」! 
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。