您的位置 首页 知识

选择法排序C语言(选择法与冒泡法的区别图解)

c语言中选择法是什么? c语言中的选择法是什么意思?在程序中用数组大小比较算选择法吗? 选择法是c中对数组进行…

c语言中选择法是什么?

c语言中的选择法是什么意思?在程序中用数组大小比较算选择法吗?

选择法是c中对数组进行排序的一种方法。

以整形数组元素为例,有数组A[10](以C语言为例描述),即A[0],A[1],…,A[8],A[9](假设其元素均互不相同)。要求对其元素排序使之递增有序。

首先以一个元素为基准,从一个方向开始扫描,比如从左至右扫描,以A[0]为基准。

接下来从A[0],…,A[9]中找出最小的元素,将其与A[0]交换。

然后将基准位置右移一位,重复上面的动作,比如,以A[1]为基准,找出A[1]~A[9]中最小的,将其与A[1]交换。

一直进行到基准位置移到数组最后一个元素时排序结束(此时基准左边所有元素均递增有序,而基准为最后一个元素,故完成排序)。

冒泡排序和选择排序有什么区别?

冒泡排序和选择排序是两种常用的排序算法,它们虽然都是基于比较的排序算法,但在具体实现和性能上有所不同。

1. 冒泡排序算法:依次比较相邻的两个元素,并将比较大(或比较小)的数交换到后面,因此每次排序的过程都可以将一个相对较大(或较小)的数移动到最右边。排序的过程中,数据像冒泡一样慢慢地从底部升到顶部,因而得名冒泡排序。

2. 选择排序算法:每次从待排序的数据元素中选择最小的一个元素,然后将其存放到序列的起始位置,再从剩余未排序的元素中寻找最小的元素,放到已排序序列的末尾,直到所有元素均排序完毕。

因此,两种算法的区别如下:

1. 冒泡排序每次比较是相邻元素之间的比较,而选择排序每次比较是在所有未排序的元素中选择最小值。

2. 在最好情况下,冒泡排序的时间复杂度为O(n),而选择排序的时间复杂度始终为O(n2)。

3. 在数据规模较小时,冒泡排序具有一定优势,但在数据规模较大时,选择排序更具优势,因为选择排序的交换次数很少(理论上只需要n-1次),并且空间占用小(只需要一个额外的变量记录最小值的位置)。

综上所述,冒泡排序和选择排序都是比较常见的简单排序算法,但是选择排序在时间和空间上都更加高效,适用于大规模数据的排序。

VB冒泡排序法和选择排序法的优缺点比较

  • 就是两种排序法的区别和优劣,要详细一点,跪求
  • 是写论文还是程序?

c语言的选择排序法 我在devc++里编的。我现在该怎么修改。

  • #include "stdio.h" void sort(int a[],int n) {int i,j,k,t; for(i=0;in-1;i++) {k=i; for(i=j+1;jn;j++) if(a[j]a[k]) k=j; t=a[k]; a[k]=a[i]; a[i]=t; } } main() {int a[10],i; printf("please input 10 numbers:n&quo粻钉纲固蕺改告爽梗鲸t;); for(i=0;i10;i++) scanf("%d",&a[i]); printf("the sorted numbers are:n"); sort(int a[10],10); for(i=0;i10;i++) printf("%d ",&a[i]); }最后就说我有错误F:Dev-Cpp源代码选择排序.cppIn function int main():208F:Dev-Cpp源代码选择排序.cpp[Error] expected primary-expression before int
  • sort(int a[10],10);改为 sort( a,10);

直接插入排序、二分法插入排序、希尔排序、直接选择排序、堆排序、交换排序、快速排序英文怎么说?

  • 直接插入排序:Straight Insertion Sortbr二分法插入排序: Bi怠胆糙感孬啡茬拾长浆nary Sortbr希尔排序:Shell Sortbr直接选择排序:Straight Select Sortbr堆排序:Heap Sortbr交换排序:Swap Sortbr快速排序:Quick Sortbr基数排序:Radix Sortbr归并排序:Merge sort

请问为何这个程序实现不了选择法排序?感激不尽!O(∩_∩)O谢谢!

  • #includestdio.hint main(){ int i,a[15],max,j,t,n=15; printf("Please input the numbers :n"); for(i=0;i15;i++) {printf("a[%d]=",i); scanf("%d",&a[i]);} printf("nThe entered numbers:n"); for(i=0;i15;i++) printf("%5d",a[i]); for(i=0;in-1;i++) { max=a[i]; for(j=0;jn;j++) if(a[j]max){t=j;max=a[j];} a[t]=a[i]; a[i]=max; } printf("nThe sorted numbers:n"); for(i=0;i15;i++) printf("%5d",a[i]); return 0;}问题补充: 这个程序没有实现排序,运行的结果是一组没有规律的输出。
  • for(i=0;in-1;i++) { max=a[i];t=i;这是给你加上的for(j=i+1*这里循环初值改了*;jn;j++)if(a[j]max){t=j;max=a[j];} a[t]=a[i]; a[i]=max; }看看这样行不

严蔚敏版本的 数据结构中 的二叉排序树中 删除节点 时 重接 Q的左右子树 的方法为何 有选择语句?

  • 就是这张图片中下面画线的部分,为什么要用一个if else选择呢?
  • 因为有可能该删除的节点下面的左子树没有右子树的情况。如下(其中O是待删除的节点,O 下面有左右子树L、R,但L下面没有右子树,这种情况下,直接把L的左子树,也就是A提上来即可)——————–根—————————————O——-X——————————–L——-R——————A

请大神帮我改一下程序,请问选择法排序本身是不是有bug?

  • #include string.h#include math.h#include stdlib.h#include stdio.hint main (){int i,j[5],m,n,k;char a[10]="awerty";char b[10]="qwretu";char c[10]="qdwiacn";char d[10]="qda";char e[10]="qucw";char *p,*f[5]={a,b,c,d,e};for(i=0;i5;i++){printf("%d:%sn",i+1,*(f+i));}printf("n");for(i=0;i5;i++){j[i]=strlen(*(f+i));}for(i=0;i5;i++)printf("%d",j[i]);printf("n");for(m=0;m4;m++){k=m;for(n=m+1;n5;n++)if(j[m]j[n])k=n;i=j[m];j[m]=j[k];j[k]=i;p=*(f+m);*(f+m)=*(f+k);*(f+k)=p;}for(i=0;i5;i++)printf("%d",j[i]);printf("nn");for(i=0;i5;i++){printf("%d:%sn",i+1,*(f+i));}printf("n");return 0;}问题补充:
  • *1:awerty2:qwretu3:qdwiacn4:qda5:qucw6 6 7 3 41:aertwy2:eqrtuw3:acdinqw4:adq5:cquwPress any key to continue*#include string.h#include math.h#include stdlib.h#include stdio.hint main () {int i,j[5],m,n,k;char a[10] = "awerty";char b[10] = "qwretu";char c[10] = "qdwiacn";char d[10] = "qda";char e[10] = "qucw";char ch,*f[5] = {a,b,c,d,e};for(i = 0;i 5;i++) {printf("%d:%sn",i + 1,*(f + i));}printf("n");for(i = 0;i 5;i++) {j[i] = strlen(*(f + i));}for(i = 0;i 5;i++)printf("%d ",j[i]);printf("n");for(i = 0; i 5; ++i) { 对5个数组都进行排序for(m = 0;m j[i] – 1;m++) {k = m;for(n = m + 1;n j[i];n++)if(f[i][k] f[i][n]) k = n;if(k != m) {ch = f[i][k];f[i][k] = f[i][m];f[i][m] = ch;}}}for(i = 0;i 5;i++) printf("%d ",j[i]);printf("nn");for(i = 0;i 5;i++) {printf("%d:%sn",i + 1,*(f + i));}printf("n");return 0;}

菜鸟求救,c语言求解???选择法从小到大排序

  • #include iostreamusing namespace std;int main(){int a[10];int i;void sort(int a[],int n);cout"input 10 numbers:";for(i=0;i10;i++)cina[10];sort(a,10);for(i=0;i10;i++)couta[i] ;coutendl;return 0;}void sort(int a[],int n){int i,j,c;for(i=0;in-1;i++)for(j=i+1;jn;j++){if(a[i]a[j])c=a[i]; a[i]=a[j];a[j]=c;}}
  • 你这个是要用C语言的语法来?

c语言的一个和选择排序法有关的问题

  • 选择排序法为什么不能直接简化为下面这段程序?for(i=0;in-1,i++){for(j=i+1;jn;j++)if(b[i]b[j]){t=b[i];b[i]=b[j];b[j]=t;}
  • 你这个根本就不是选择排序,而是冒泡排序!

C语言选择排序法 问题

  • #include "Stdio.h"void main(){ void sa(int array[],int n); int array[10],i; printf("enter the array:n"); for(i=0;i10;i++) scanf("%d",&array[i]); sa(array,10); printf("the sorted array:n"); for(i=0;i10;i++) printf("%dt",array[i]); getch();}void sa(int array[],int n){ int i,j,k,temp; for(i=0;i10;i++) { k=i; for(j=i+1;jn;j++) if(array[j]array[k]) k=j; temp=array[k]; array[k]=array[i]; array[i]=temp; }}以下是我的理解逻辑不知道错在哪里?是变量k的值理解错了吗?请高手详细通俗指点迷津假如array[0]=35,array[1]=8,array[2]=9,array[3]=2,array[4]=-5,array[5]=-1,array[6]=10,array[7]=6,array[8]=62,array[9]=30第一轮比较即执行第一个for循环i=0时第二个for循环的第一次循环情况是此时j=1,k=i=0即if(array[1]array[0])即835 即真则执行k=j;此时k=1,i=0(第一个for循环i=0时)接着交换数组元素即array[0]=8,array[1]=35第二个for循环的第二次循环情况是此时j=2,k=1(没有跳出第二个for循环k的值不会被释放吧?即使释放k的值也不可能为k=i=0?)即if(array[2]array[1])即935 即真则执行k=j;此时k=2,i=0(第一个for循环i=0时)接着交换数组元素即array[0]=9,array[2]=8此时数组元素值已改变即array[0]=9,array[1]=35,array[2]=8,array[3]=2,array[4]=-5,array[5]=-1,array[6]=10,array[7]=6,array[8]=62,array[9]=30 此逻辑推出的结果为:array[0]=-1,array[1]=35,array[2]=8,array[3]=9,array[4]=2,array[5]=-5,array[6]=10,array[7]=6,array[8]=62,array[9]=30array[5]=-5没有排到首位明显出错了
  • if(array[j]array[k])k=j; if(k!=j) { temp=array[k]; array[k]=array[i]; array[i]=temp; }个中滋味自己体会

C语言的选择排序法应该怎么用?

  • 编一个把三个数排序的程序,要求用数组的形式和选择排序法,谢谢
  • void main(){int a[3]={5,3,4};int k=0,s=0,pos=0,temp=0;for(k=0;k2;k++){ pos=k; for(s=k+1;s3;s++) { if(a[pos]a[s]) { pos=s; } } if(pos!=k) { temp=a[k]; a[k]=a[pos]; a[pos]=temp; } }}
版权声明
返回顶部