C语言选择排序法

#include<stdio.h>
void main()
{
void sort(int array[],int n);
int a[10],i;
printf("enter the array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("the sorted array:\n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
}
void sort(int array[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k])
k=j;
t=array[k];array[k]=array[i];array[i]=t;

}
}
代码如上,我的问题是,第一次执行时,用a【0】和a【1】比较,如果满足a【0】<a【1】则交换两者位置,第二次是比较a【0】和a【2】还是比较a【1】和a【2】。k在第一次比较完后因为倒数第二行代码不是已经变成K=1了吗,也就是以后再也不会让a【0】和后面的数字相比较了,但是如果这样就实现不了选择排序的功能啊,很纠结

这是选择排序。先用a[0]与a[1]比较,当a[0]<a[1]时并不交换,而用k记下来现在a[0]最小……这样一趟比较完后a[k]就是整个数组中最小的元素,把它与a[0]交换;第二趟,从a[1]开始重复前面的操作,那么最后a[1]就是剩下的n-1个元素中最小的……看a[0]、a[1]已经由小到大排好了,当做完n-1趟时不就把整个数组都排好了吗?注意:t=array[k];array[k]=array[i];array[i]=t;不是for(j=i+1;j<n;j++)的循环体,要等它循环完了后才执行一次。追问

恍然大悟,原来交换值要内循环完一次才进行。内循环只是在记录最小的。谢谢

追答

追问的理解OK!

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-26

选择排序(Selection sort)是一种简单直观的排序算法。工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 

以下是一个实现选择排序的例子:

#define SWAP(x, y, t)  ((t) = (x), (x) = (y), (y) = (t))
 //将list中的n个数据,通过选择排序算法排序。
void selete_sort(int list[], int n)
{
    int i, j, min, temp;
    for (i = 0; i < n - 1; i++){
        min = i;
        for (j = i + 1; j < n; j++)//找出最小元素的下标。
            if (list[j] < list[min])
                min = j;
        SWAP(list[i], list[min], temp);//交换最小元素到当前起始位置。
    }
}

第2个回答  2013-07-15
选择排序与冒泡排序算法类似。
首先假定第i个元素最小(或最大--增排序),并用k记录,内循环j从第i + 1个元素开始逐个与第k个元素比较,如果满足array[j] < array[k],则执行k = j,k始终保存最小元素的下标,j循环结束后,再进行k与i比较,如果满足i == k,则原先假定正确,不需要交换,否则,假定是错的,则需要交换,这样就确保第i轮循环结束后,array[i]是最小的。
这么说显得枯燥,你可以取用只有几个元素的数组手工模拟排序,理解原理后就很容易记住选择排序的代码啦。追问

我不懂的是如果第一次比较后a0小于a1,k=j=1,下一次内循环就只能用a1和a2比,a0再也不参与比较了,

其实就是内循环第一次之后是否还执行k=i这步?

第3个回答  2018-05-13

这是简单选择排序。但你图中的是未经优化的,因为移动次数和比较次数的时间复杂度都是O(n²),而优化了的选择排序的移动次数的时间复杂度最优可以达到O(n)
如下图参考自《数据结构(C语言版)》——清华大学出版社


如图,如有疑问或不明白请追问哦!

第4个回答  2013-06-21
每次从未排序的数字中选择最小的,与未排序的第一个交换,直到剩一个为止例子:(3 5 4 1 2 ) 选择最小为1,与3交换1 (5 4 3 2) 从剩余的选择最小为2 ,与5交换1 2 (4 3 5) 选择最小为3 与4交换1 2 3 (4 5)选择最小为4 ,它就是未排序第一个,不交换1 2 3 4 (5) 只剩一个了,结束

c语言常用数组排序方法
选择排序法 在待排序数组中,查找最大或最小的元素,将其与最前面未排序元素互换位置。查找最大值时从小到大排序,查找最小值时从大到小排序。使用变量iTemp存放最值,iPos记录最值位置。进行内外双层循环,外层循环将最值交换,内层循环查找最值。每次外层循环包含从m-n次内层循环,m为元素总数,n为...

C语言的选择排序法
int a[10], i;在主循环中输入数组元素:c for (i = 0; i < 10; i++) { scanf("%d", &a[i]);} 输出原始数组元素:c for (i = 0; i < 10; i++) { printf("=", a[i]);} printf(" ");调用排序函数:c com(a, 10);这里需要定义排序函数:c void com(int arr[],...

C语言中的选择排序法是什么?
选择排序(Selection sort)是一种简单直观的排序算法。工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。以下是一个实现选择排序的例子:define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t)) \/\/将...

C语言 | 选择法对10个数排序
C语言中,利用选择法对一组10个整数进行排序的实现方法直观易懂。该排序算法的基本思想是,每一轮比较中,从剩余未排序的数中选出最小的一个与当前未排序序列的第一个元素交换位置,直至所有元素有序。以下是排序过程的四个关键步骤:首先,通过键盘输入获取10个整数,作为待排序的数组。然后,程序会显...

c语言如何用选择排序对10个整数排序
用选择法对10个整数排序,用scanf输入。如下:include<stdio.h> int main(){ int i,j,min,temp,a[10];printf("enter data:\\n");for (i=0;i<10;i++){ printf("please enter ten numbers:\\n");scanf("%d",&a[i]); \/\/输入10个数 } printf("\\n");printf("The orginal numbers:...

c语言 选择法排序
选择法就是找出最小或最大的放在头上,然后从剩下的部分中重复这个过程:1:i循环,对a[1]到a[9]这九个数 2:i循环开始 3:假设a[i]为最小,保存i到min 4:j循环,对a[i+1]到a[10]这些数 6:j循环开始 7:判断a[min]是否大于a[j]8:条件语句开始 9:条件成立,则说明当前的最小...

选择排序法C语言问题
选择排序法是将第一个数默认为最小值,然后将它后面的数和它进行比较,如果有数比它小,用min_k记录这个较小数的下标,min等于这个数,然后接着向后比较,(注意后面的数一直和min比较)一直到最后一个数也比较完,这时i=n,min记录的时最小的数的值,min_k记录最小值的下标,接着进行交换,( x...

c语言的两种排序?
1、选择排序法 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 代码:include<stdio.h> int main(int argc,const char*argv[]){ int num[10],i,j,k,l,temp;\/\/用一个数组保存输入的数据 for(i=0;i<=9;i++){ scanf(...

c语言问题,用选择法排序
选择法的算法:假设需要对10个数进行排序,那么首先找出10个数里面的最小数,并和这个10个数的第一个(下标0)交换位置,剩下9个数(这9个数都比刚才选出来那个数大),再选出这9个数中的最小的数,和第二个位置的数(下标1)交换,于是还剩8个数(这8个数都比刚才选出来的大)..依次类推...

如何用c语言编写选择排序的程序?
1、打开visual C++ 6.0,准备一个空白的c语言文件,引入头文件,在main函数中定义变量和数组:2、接下来用scanf函数输入的10个数,将输入的数存入到变量a中,接着进行比较排序,如果后一个数比前一个数大则利用中间变量t实现俩值互换,最后输出排序的结果:3、编译运行程序,输入任意的10个数,回车...

相似回答