选择法排序
选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从待排序的数据中选择最小(或最大)的元素,放到已排序序列的末尾,直到全部元素排序完成。
选择排序的步骤(以用指针的选择法排序为例):
1、遍历待排序序列,设立一个指针,初始指向序列的第一个元素。
2、从当前指针位置开始,依次与后面的元素比较,找到最小的元素,并记录其位置。
3、将最小的元素与当前指针位置的元素进行交换。
4、将指针向后移动一位,重复步骤2和步骤3,直到指针移动到序列的倒数第二个元素。
5、完成上述步骤后,最后一个元素已经是序列中的最大元素,排序完成。
选择排序的时间复杂度为O(n^2),其中n为待排序序列的长度。尽管选择排序的时间复杂度较高,但它的实现简单,适用于小规模的数据排序。
方法一:普通的选择法排序
#include<stdio.h>
int main()
{
int a[10] = { 7,4,1,8,5,2,9,6,3,0 };
int i, j, t;
for (i = 0; i < 10; i++)//依次选择元素
{
for (j = i + 1; j < 10; j++)//与每一个元素进行比较
{
if (a[i] >a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%3d", a[i]);
}
return 0;
}
总结
普通的选择法排序非常直观的展现出选择法排序的算法思路,先选择要进行排序的元素,再依次与其余元素进行比较、交换位置,最终完成排序。
方法二:利用指针的选择法排序
#include<stdio.h>
int main()
{
void chioce(int* x, int y);//定义选择法排序的函数
int n, i;
int arr[100];
scanf("%d", &n);//确定排序元素个数
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
chioce(arr, n);
for (i = 0; i < n; i++)
{
printf("%d", arr[i]);
}
return 0;
}
void chioce(int* x, int y)//用指针传参
{
int i, j, tmp;
for (i = 0; i < y ; i++)//与末尾x++配合使用,确保指针能依次后移
{
for (j = 1; j < y - i; j++)//第二层循环依次比较
{
if (*x > *(x + j))
{
tmp = *x;
*x = *(x + j);
*(x + j) = tmp;
}
}
x++;//指针后移,指向下一个元素
}
总结
利用指针的选择法排序,分为两个模块(主函数和选择排序函数)使得结构更加规整。使用指针传参,让该程序更加简洁、高效。与普通的选择法排序不同之处在于,普通选择法排序的第一层循环是用于确定需要排序的元素,而利用指针技术的第一层循环是用于确定比较的次数与指针后移(x++)配合使用。
两种方法的区别
两种方法在思想上是相同的,只是在实现过程中有所不同。方法一是直接在数组中进行比较虽然看起来比较直观,但是如果元素过多要通过函数传参实现就会使程序运行效率减低。方法二,利用指针的不断后移去访问相应的元素,只需要控制好指针的移动就可以实现排序,可以使程序的效率大大提高。