C语言 排序问题
1个回答
关注
展开全部
一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。A再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。优点:稳定;缺点:慢,每次只能移动相邻两个数据。二、选择排序每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:①初始状态:无序区为R[1..n],有序区为空。②第1趟排序在无序区R[1.n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1.1]和R[2.n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。③第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1.i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。优点:移动数据的次数已知(n-1次);缺点:比较次数多。三、插入排序已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、…b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。
咨询记录 · 回答于2022-11-27
C语言 排序问题
t=0; for(j=0;j
一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两亩衡梁者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。A再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。优点:稳定;缺点:慢,每次只能移动相邻两个数据。二、选择排序每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:①初始状态:无序区为R[1..n],有序区为空。②第1趟排序在无序区R[1.n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1.1]和R[2.n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。③第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1.i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。优点:移动数据的次数已知(n-1次)拦余;缺点:比较次数多。三、插入排序已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、…b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则迅运跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。
这个程序什么意思
t=0; for(j=0;j
这个程序可不可以解释一下
#include#include#define MAX 1000int main(){ int a[MAX] , i , j , n , p , q , s1 , s2;p = 0 ; q = 0 ; s1 = 0 ; s2 = 0;printf("请输入要输入薯知晌的值的个数:");scanf("%d",&n);printf("请输入这些数的数值:\n");for(i = 0 ; i < n ; i++ )scanf("%d",&a[i]);for(j = 0 ; j < n ; j++)if(a[j]%2 == 0 ){p = p + 1 ; s1 = s1 + a[j];}else {q = q + 1 ; s2 = s2 + a[j];}printf("偶数的个数为 %d\n" , p);printf("偶数的和为 %d\n" , s1);printf("奇数的个猛洞数为数锋 %d\n" , q);printf("奇数的和为 %d\n" , s2);system("PAUSE");return 0;}
?这也不沾边啊
先码闭观察 for ( j = 1 ; j < = i ; j++ ) for ( k = 1; k < = j ; k++ ) 可知若隐模悄i=w,则程序段执行次数为1+2+..+w. 因此定义f(i)=1+2+..+i 那么总灶渣的执行次数为 f(1)+f(2)+..+f(n)=1*n+2*(n-1)+3*(n-2)
中间那段程序什么意思啊
该for循环,一重时时间复杂度为O(n),二重时为O(n^2)