选择法排序
选择法排序指每次选择所要排序的数组中的最大值(降序)或最小值(升序)的数组元素,将这个数组元素的值与最前面没有进行排序的数组元素的值互换。
下面以数字9、6、15、4、2为例,进行选择法排序,我们选择升序方式排序,每次交换的顺序如下表所示。
排序过程/数组元素 | 元素【0】 | 元素【1】 | 元素【2】 | 元素【3】 | 元素【4】 |
---|---|---|---|---|---|
起始值 | 9 | 6 | 15 | 4 | 2 |
第1次值 | 2 | 6 | 15 | 4 | 9 |
第2次值 | 2 | 4 | 15 | 6 | 9 |
第3次值 | 2 | 4 | 6 | 15 | 9 |
第4次值 | 2 | 4 | 6 | 9 | 15 |
排序结果 | 2 | 4 | 6 | 9 | 15 |
可以发现,在第一次排序过程中将第一个数字和最小的数字进行了位置互换;而第二次排序过程中,将第二个数字和剩下的数字中最小的数字进行了位置互换,依此类推,每次都将下一个数字和剩余的数字中最小的数字进行位置互换,直到将一组数字按从小到大排序。
相关例程代码
#include <stdio.h>
void printf_array(int* a, int len);//打印
void sort_array(int* a, int len);//排序
int main(void)
{
int a[] = {9,6,15,4,2};
int n;
n = sizeof(a) / sizeof(a[0]);//元素个数
printf("排序前\n");
printf_array(a, n);
sort_array(a,n);
printf("排序后\n");
printf_array(a, n);
printf("\n");
return 0;
}
void printf_array(int* a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%d ", *(a + i));
}
printf("\n");
}
void sort_array(int* a, int len)
{
int i, j;
int tmp = 0;
for (i = 0; i < len - 1; i++)
{
for (j = i + 1; j < len; j++)
{
if (*(a+i) > *(a+j))//升序
{
tmp = *(a+i);
*(a+i) = *(a+j);
*(a+j) = tmp;
}
}
}
}