1. 冒泡排序
typedef unsigned int size_t;
typedef signed int ssize_t;
void bubble_sort(size_t *data, size_t len)
{
size_t i, j, flag = 0;
size_t tmp;
for(i = 0; i < len-1; i++)
{
if(flag == 1)
{
break;
}
flag = 1;
for(j = 0; j < len-1-i; j++)
{
if(data[j] > data[j+1])
{
flag = 0;
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
}
}
- 空间复杂度: O(1)
- 时间最佳情况:O(n)
- 时间最差情况:O(n2)
- 时间平均情况:O(n2)
- 稳定排序
2. 选择排序
void selection_sort(size_t *data, size_t len)
{
size_t i, j, min_index;
size_t tmp;
for(i = 0; i < len-1; i++)
{
min_index = i;
for(j = i+1; j < len; j++)
{
if(data[j] < data[min_index])
{
min_index = j;
}
}
if(min_index != i)
{
tmp = data[i];
data[i] = data[min_index];
data[min_index] = tmp;
}
}
}
- 空间复杂度: O(1)
- 时间最佳情况:O(n2)
- 时间最差情况:O(n2)
- 时间平均情况:O(n2)
- 不稳定排序
3. 插入排序
void insertion_sort(size_t *data, size_t len)
{
size_t i;
ssize_t pre_index;
size_t curr_data;
for(i = 1; i < len; i++)
{
pre_index = i-1;
curr_data= data[i];
while( (pre_index >= 0) && (data[pre_index] > curr_data) )
{
data[pre_index + 1] = data[pre_index];
pre_index--;
}
data[pre_index + 1] = curr_data;
}
}
- 空间复杂度: O(1)
- 时间最佳情况:O(n)
- 时间最差情况:O(n2)
- 时间平均情况:O(n2)
- 稳定排序
4. 希尔排序
void shell_sort(size_t *data, size_t len)
{
size_t i;
size_t gap = len/2;
ssize_t pre_index;
size_t curr_data;
while(gap > 0)
{
for(i = gap; i < len; i++)
{
pre_index = i-gap;
curr_data = data[i];
while( (pre_index >= 0) && (data[pre_index] > curr_data) )
{
data[pre_index + gap] = data[pre_index];
pre_index -= gap;
}
data[pre_index + gap] = curr_data;
}
gap /= 2;
}
}
- 空间复杂度: O(1)
- 时间最佳情况:O(n*log n)
- 时间最差情况:O(n*log2n)
- 时间平均情况:O(n*log2n)
- 不稳定排序