C语言中冒泡排序法和选择排序法有哪些不同

C语言中冒泡排序法和选择排序法有哪些不同,第1张

不同点:

冒泡排序法:一趟一趟的将两个相邻的数进行交换如果有10个数则需要排9躺,如果是从大到小输出则需要每次将后一个数和前一个数进行比较将较大的数赋值给钱一个数,将较小的数赋值给后一个数,其实就是两个数交换,那么第一趟交换完毕后,最小的数便出现在了数组的最后面,然后进行第二趟的比较时则要对余下的前9个数进行比较,9趟比较完成后则数组也已经排好序。

选择排序法:10个数则是需要排9次,若按降序排列,第一次比较:则是将数组的第一个元素与数组中从第二个元素开始到最后的元素进行比较找到最大的数记录下来然后将值赋值给数组的第一个元素,然后进行第二次比较:则是将数组的第二个元素与数组中从第三个元素开始到最后的元素进行比较,找最大的数记录下来将值赋值给数组的第二个元素,依次循环找完。

程序分析:

选择排序:

1>.对于选择排序,首先理解排序的思想。给定一个数组,这种思想首先假定数组的首元素为最大(最小)的。此时就要利用3个变量i,j,k表示元素的下标。i表示当前,j表示找到的最大(最小)的下标,k用于存放每次循环中最大值的下标。

2>.在掌握了程序的基本思想之后,再进行排序。找到最大的下标后赋给k。找到之后判断所假设的当前值是否为此次循环的最大值,如果不是,就交换a[k] 与当前a[i]的值,从而将数组以一定的顺序排放,最后写一个循环将结果输出。

冒泡排序:

1>.对于冒泡排序,主要采用的是相邻数两两进行比较的思想。如果后一个比前一个大(小),则将其调换位置,直至所有的数都比较完。

2>.如果给定一个大小为n的数组,那么需要比较n-1趟,每一趟比较n-1-i次 ,i 表示上次循环中已经比较完的下标。写两个循环 判断,如需交换则进行交换,如果不需要交换则进行下两个数的比较,直到所有的数比较完。最后,用一个循环将排序完成后的数全部输出。

先上选择法和冒泡法:

1.选择法

#include<stdio.h>

void

main()

{

int

i,j,min,temp

int

a[10]

printf("请输入十个整数:")

for(i=0i<=9i++)

scanf("%d",&a[i])

for(i=0i<9i++)

{

min=i

for(j=i+1j<=9j++)

{

if(a[min]>a[j])

{

min=j

}

temp=a[j]

a[j]=a[min]

a[min]=temp

}

}

for(i=0i<=9i++)

printf("%4d",a[i])

}

2.冒泡法

#include<stdio.h>

void

main()

{

int

i,j,temp

int

a[10]

printf("请输入十个整数:")

for(i=0i<=9i++)

scanf("%d",&a[i])

for(i=0i<9i++)

for(j=9j>ij--)

{

if(a[j]<a[j-1])

{

temp=a[j]

a[j]=a[j-1]

a[j-1]=temp

}

}/*

for(j=0j<9-ij++)

{

if(a[j]>a[j+1])

{

temp=a[j]

a[j]=a[j+1]

a[j+1]=temp

}

}大的气泡往下沉,小的气泡往上浮!!!注意:是a[j-1]还是a[j+1];

深刻了解!!!

*/

for(i=9i>=0i--)

printf("%4d",a[i])

}

通过这两个程序,可以发现他们的编程还是有些区别的,但是总结下:

相同点:

1.都要通过n-1组排出具有n个数的顺序;

2.都是通过逐个相比,比出最值的;

。。。

不同点:

1.冒泡法,顾名思义就是把小的泡冒到上面,大的泡沉到下面,最值在中间和其他的值交换;

而选择法,是假定了一个最值,所以最值和其他的值的交换就发生在假定最值的地方;

。。。

其实冒泡法和选择法的区别不大,都是效率比较低的方法。

//C语言示例代码如下

#include <stdio.h>

#define N 10

//冒泡排序(升序)

void bubble_sort(int a[],int n)

{

int i,j  //j表示趟数,i表示第j趟两两比较的次数

int tmp //临时变量

for(i=0i<n-1i++)

for(j=0j<n-1-ij++)

{

if(a[j] > a[j+1])

{

tmp=a[j]

a[j]=a[j+1]

a[j+1]=tmp

}

}

}

//选择排序算法,按从小到大顺序

void select_sort(int *array,int n)

{

    int i,j,k

    int tmp

    for(i=0i<n-1i++)

    {

        k=i  //开始一趟选择排序,假定第i个元素是后面n-i+1个未排序的元素中最小的元素

        for(j=i+1j<nj++)

        {

if(array[k] > array[j]) //如果发现比当前最小元素还小的元素,则更新记录最小元素的下标k

    k=j

        }

//如果最小元素的下标不是后面n-i+1的未排序序列的第一个元素,则需要交换第i个元素和后面找到的最小元素的位置

        if(k != i)

        {

            tmp=array[k]

            array[k]=array[i]

            array[i]=tmp

        }

    }

}

int main()

{

int arr[N]

int i

printf("输入数组元素: ")

for(i=0i<Ni++)

scanf("%d",&arr[i])

bubble_sort(arr,N)  //调用冒泡排序函数

printf("输出排序后的数组元素: ")

for(i=0i<Ni++)

printf("%d ",arr[i])

printf("\n输入数组元素: ")

for(i=0i<Ni++)

scanf("%d",&arr[i])

select_sort(arr,N)  //调用选择排序函数

printf("输出排序后的数组元素: ")

for(i=0i<Ni++)

printf("%d ",arr[i])

printf("\n")

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11238766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存