提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
排序算法在我们学习编程语言中扮演着重要的角色。其中对于像我这种刚开始学习C语言的新手小白十分友好且容易掌握的排序算法是 冒泡排序、选择排序和插入排序。也许新手小白不认可我的观点。那么我就用一组简单的数字用选择排序并且深入其排序过程通过自己的学习体会给大家讲解一下。
一、选择排序是什么?
选择排序的定义是:把待排序元素中的第一个数当做最大值,并且把该元素后的所有元素与第一个元素比较。比较完所有元素后把第一个元素与最大元素交换,那么第一个元素就位最大值,下一次比较时就把第二个元素当做最大值,并把第二个元素后的所有元素与其比较。重复上述步骤就可以得到一个降序序列。如果把第一个元素当做最小值,重复上述步骤就可以得到一个降序序列。
举个例子:
定义一个数组arr[6]={2,3,1,6,4,5};
i为要保存最大值的位置下标,定义 k=i 来保存最大元素的位置;用变量 j 来遍历i位置后的元素。如果 arr[j]>arr[k] , k=j; 每趟得到一个最大元素的下标用 k 保存。最后交换位置 i 和位置 k 的元素 ;重复上述过程就会得到一个有序序列。
原数组:arr[6]={2,3,1,6,4,5};
过程: i=0时:arr[6]={6,3,1,2,4,5} k=3
i=1时:arr[6]={6,5,1,2,4,3} k=5
i=2时:arr[6]={6,5,4,2,1,3} k=4
i=3时:arr[6]={6,5,4,3,1,2} k=5
i=4时:arr[6]={6,5,4,3,2,1} k=5
( i 的位置是最后一个元素的前一个元素的下标,所以i=5没有必要,例如只有两个元素排序,我们只需要用 i=0 记录第一元素的位置,用 j 记录第二个元素的位置就可以得到有序序列。)
结果:arr[6]={6,5,4,3,2,1};
二、代码
1.降序
代码如下(示例):
#include<stdio.h>
int main()
{
int arr[] = {2,3,1,6,4,5};
int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
int i = 0;
int j = 0;
for (i = 0; i < sz-1; i++)//假设下标为i的元素最大
{
int k = i;//保存第n大的元素下标
j = i + 1;//位置i的后一个元素
while (j < sz)
{
if (arr[k] < arr[j])//位置k的元素与它后面的元素比较
k = j; //若arr[k]>arr[j],更新k的值(保存较大值的下标)
j++; //j自加指向后一个元素
}
if (k != i)//若k与假设最大值的下标不相等,就交换arr[i]和最大值arr[k]
{
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
printf("降序为:");
for (i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
}
运行结果 (降序):
2.升序
#include<stdio.h>
int main()
{
int arr[] = { 2,3,1,6,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
int i = 0;
int j = 0;
for (i = 0; i < sz-1; i++)//假设下标为i的元素最小
{
int k = i;//保存第n小的元素下标
j = i + 1;//位置i的后一个元素
while (j < sz)
{
if (arr[k] > arr[j])//位置k的元素与它后面的元素比较
k = j; //若arr[k]>arr[j],更新k的值(保存较小值的下标)
j++; //j自加指向后一个元素
}
if (k != i)//若k与假设最小值的下标不相等,就交换arr[i]和最小值arr[k]
{
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
printf("降序为:");
for (i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
}
运行结果 (升序):
总结
我这里所讲的快速排序是自己学习过程中的感受和心得,更贴近新手小白的学习。如果有误请大家留言!!!