×

选择排序算法 排序 c

选择排序算法(c语言 选择法排序)

admin admin 发表于2022-09-03 03:05:00 浏览95 评论0

抢沙发发表评论

本文目录

c语言 选择法排序


void sa(int array,int n)
{
int i,j,k,temp;
for(i=0;i《10;i++)
{
k=i; //保存i的值,用k来进行循环排序
for(j=i+1;j《n;j++) //将第i个元素后面的元素与第i个元素进行比较
if(array[j]《array[k]) //如果第k=i个元素后面的元素小于i号元素,交换两个元素的标号, 这样就将最小元素的标号放到最前面
k=j; //交换标号
temp=array[k]; //循环结束后,交换两个标号下的元素的值
array[k]=array[i];
array[i]=temp;
}
}
这个程序实现的是由小到大的排序。第二个循环里面,就是i号元素后面最小的元素对应的标号放到k中,在交换当前元素与k号元素中的值,实现由大到小排序

C语言编程:选择法排序


选择排序是一种简单直观的排序算法。

工作原理:

    每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 

性能:

    选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个与交换,导致第一个5挪动到第二个5后面)。

    选择排序的时间复杂度是O(n^2)

思想:

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。-排序

C语言版代码:

#include 《stdio.h》
#include 《math.h》
 
#define MAX_SIZE 101
#define SWAP(x, y, t)  ((t) = (x), (x) = (y), (y) = (t))
 
void sort(int, int);      /* selection sort */
 
int main()
{
    int i, n;
    int list[MAX_SIZE];
    printf(“Enter the number of numbers to generate: “);
    scanf_s(“%d“, &n);
    if (n 《 1 || n 》 MAX_SIZE){
        fprintf(stderr, “Improper value of n\n“);
        exit(1);
    }
    for (i = 0; i 《 n; i++){    /* randomly generate numbers */
        list[i] = rand() * 1000;
        printf(“%d “, list[i]);
    }
    sort(list, n);
    printf(“\n Sorted array:\n“);
    for (i = 0; i 《 n; i++)    /* print out sorted numbers */
        printf(“%d “, list[i]);
    printf(“\n“);
    return 0;
}
void 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);
    }
}
-c

选择排序法的介绍


选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。简单选择排序的基本思想:第1趟,在待排序记录r~r[n]中选出最小的记录,将它与r交换;第2趟,在待排序记录r~r[n]中选出最小的记录,将它与r交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。-排序


选择排序算法的思想是什么


次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x《a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x》a[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的,我们可用C++描述如下:
template《class Type》
int BinarySearch(Type a,const Type& x,int n)
{
int left=0;
int right=n-1;
while(left《=right){
int middle=(left+right)/2;
if (x==a[middle]) return middle;
if (x》a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
模板函数BinarySearch在a《=a《=...《=a[n-1]共n个升序排列的元素中搜索x,找到x时返回其在数组中的位置,否则返回-1。容易看出,每执行一次while循环,待搜索数组的大小减少一半,因此整个算法在最坏情况下的时间复杂度为O(log n)。在数据量很大的时候,它的线性查找在时间复杂度上的优劣一目了然。
选择排序
基本思想是:每次选出第i小的记录,放在第i个位置(i的起点是0,按此说法,第0小的记录实际上就是最小的,有点别扭,不管这么多了)。当i=N-1时就排完了。
直接选择排序
直选排序简单的再现了选择排序的基本思想,第一次寻找最小元素的代价是O(n),如果不做某种特殊处理,每次都使用最简单的寻找方法,自然的整个排序的时间复杂度就是O(n2)了。
冒泡法
为了在a中得到最大值,我们将a与它后面的元素a,a,...,a进行比较。首先比较a与a,如果a《a,则将a与a交换,否则不交换。这样在a中得到的是a与a中的大数。然后将a与a比较,如果a《a,则将a与a交换,否则不交换。这样在a中得到的是a,a,a中的最大值,...。如此继续,最后a与a比较,如果a《a,则将a与a交换,否则不交换。这样在a中得到的数就是数组a的最大值(一共进行了9次比较)。
为了在a中得到次大值,应将a与它后面的元素a,a,...,a进行比较。这样经过8次比较,在a是将得到次大值。
如此继续,直到最后a与a比较,将大数放于a,小数放于a,全部排序到此结束。
从上面可以看出,对于10个数,需进行9趟比较,每一趟的比较次数是不一样的。第一趟需比较9次,第二趟比较8次,...,最后一趟比较1次。
以上数组元素的排序,用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素,第一个元素与外循环i有关的,用a[i]标识,第二个元素是与内循环j有关的,用a[j]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为i+1,i+2,...。
-c

C语言中选择排序法具体是怎样的


  选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。
  简单选择排序的基本思想:第1趟,在待排序记录r~r[n]中选出最小的记录,将它与r交换;第2趟,在待排序记录r~r[n]中选出最小的记录,将它与r交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
-排序

C语言:用选择排序法对一个数组里的数进行排序,从小到大,要求选出小的进行排序


#include《stdio.h》

intmain()

{

inti=0;

inta={0,5,2,3,6,9,8,7,4,1};

intj=0;

inttmp=0;

intm=sizeof(a)/sizeof(a);//s数组大小

for(i=0;i《m-1;i++)//比较m-1次

{

for(j=0;j《m-i-1;j++)//最后一次比较a[m-i-1]与a[m-i-2]

{

if(a[j]》a[j+1])//如果a[j]比a[j+1]大则交换内容

{

tmp=a[j+1];

a[j+1]=a[j];

a[j]=tmp;

}

}

}

for(i=0;i《m;i++)

{

printf(“%d“,a[i]);//打印

}

printf(“\n“);

return0;

}

扩展资料

C语言排序法

把一个数组进行排序可以使用选择排序法。选择排序法的原理在是每一趟循环寻找数组中最小的数的下标,然后按照递增的顺序放入数组中。

循环找出最小数的下标,该下标用min保存,直到比较完整个数组,即可找到最小的数,然后将该数放入数组的第一位,这样就排好了一个元素。

需要再嵌套一层外层循环即可排好所有元素。第二次循环就不用再比较第一个元素了,因为第一个元素已经排好,依次类推,每一次循环就会排好一个,进行n-1次循环即可排好所有元素。


选择排序算法与冒泡排序算法有何异同啊


区别在于:在交换的方式上

冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。

而选择排序算法的改进在于:先并不急于调换位置,先从A开始逐个检查,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A对调,这时A到A中最小的数据就换到了最前面的位置。

所以,选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数一样的。

例如:1 2 3 4我们分别用a,a,a,a存储。假设从大到小排序

选择排序,是a和a,a,a依次比较,遇到小的就交换,这样一次下来,最大的被保存在了a.下次排序就从a开始重复以上步骤。

冒泡排序,是a和a比较,小的就交换。然后a和a比较,小的交换。然后a和a比较小的就交换。这样一次下来,最大的被保存在a。下次排序从a开始重复以上步骤。

虽然差不多,但是请注意:两者的比较方法是右差别的,一个事依次比下来,一个是俩俩比较。

扩展资料:

冒泡排序的基本思想是将数组中的每个相邻元素进行两两比较,按照小元素在前(或大元素在前)的原则确定是否进行交换。这样每一轮执行之后,最大(或最小)的元素就会被交换到了最后一位。  

同样的过程会依次进行,直到所有元素都被排列成预期的顺序为止。这个过程是不是很像是水中的起泡一个个冒起来的过程.

选择排序(select sort):每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

参考资料:百度百科-选择排序


选择排序法


这是冒泡法吧
粘些资料给你:
冒泡排序和选择排序是排序算法中比较简单和容易实现的算法。冒泡排序的思想为:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到数组的最右(左)端。而选择排序的思想也很直观:每一次排序过程,我们获取当前没有排好序中的最大(小)的元素和数组最右(左)端的元素交换,循环这个过程即可实现对整个数组排序。
还有“

还有:http://it2.chinahw.net/ioi/Article/program/suanfa/200604/139.html
-c

C语言选择排序法


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