作者喜欢写for循环。
本文内代码均采用使用GCC编译器,C99标准。

注意点

本文为从小到大排序。

交换迭代次数除了插入排序都为n-1次,n为数组长度。

直接交换排序

每迭代一次就让当前的最小数排到前面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void zhijie(int arr[], int len)
{
int i, j, t;
printf("直接交换排序:\n");
for(int i=0; i<len-1; i++)
{
for(j=i+1; j<len; j++)
if(arr[i]>arr[j])
{
t=arr[i]; arr[i]=arr[j]; arr[j]=t; /*交换元素*/
}

for(j=0; j<len; j++) /*输出迭代一次后的结果*/
printf("%d ", arr[j]);
printf("\n");
}
}

选择排序

与直接交换排序相似,选择排序不同之处为迭代一次仅交换一对元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void selection_sort(int arr[], int len)
{
int i, j, t;
printf("选择排序:\n");
for(i=0; i<len-1; i++)
{
int at=i;
for(j=i+1; j<len; j++)
if(arr[at]>arr[j])
at=j;
t = arr[i]; arr[i] = arr[at]; arr[at] = t;

for(j=0; j<len; j++)
printf("%d ", arr[j]);
printf("\n");
}
}

冒泡排序

每迭代一次就让当前最大数移动到末尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void maopao(int arr[], int len)
{
int i, j, t;
printf("冒泡排序:\n");
for(i=0; i<len-1; i++)
{
for(j=0; j<len-i-1; j++)
if(arr[j]>arr[j+1])
{
t=arr[j];arr[j]=arr[j+1];arr[j+1]=t;
}

for(j=0; j<len; j++)
printf("%d ", arr[j]);
printf("\n");
}
}

插入排序

每迭代一次,排序好的范围又增加一位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void insertion_sort(int arr[], int len)
{
int i,j,t;
for(i=1; i<len; i++)
{
for(t=arr[i], j=i-1; j>=0; j--)
{
if(arr[j] > t)
{
arr[j+1]=arr[j];
arr[j]=t;
}
}
for(j=0; j<len; j++)
printf("%d ", arr[j]);
printf("\n");
}
}