本文由沉墨之城贡献
济南靠谱的java培训班doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
求一个 C 语言冒泡排序法的简单程序 悬赏分:50 - 解决时间:2007-9-4 11:16 我不明白怎么写 随便给我个就行 谢谢了 提问者: redangel0002 - 助理 二级
最佳答案
main() { int i,j,temp; int a[10]; for(i=0;i<10;i++) scanf ("%d,",&a[i]); for(j=0;j<=9;j++) { for (i=0;i<10-j;i++) if (a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;} } for(i=1;i<11;i++) printf("%5d,",a[i] ); printf("\n"); }
冒泡算法 冒泡排序的算法分析与改进 交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没 有反序的记录为止。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。 冒泡排序
1、排序方法 将被排序的记录数组 ]垂直排列,每个记录 R 看作是重量为 R.key 的气泡。根据轻气泡不能在重气泡 之下的原则,从下往上扫描数组 R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行, 直到最后任何两个气泡都是轻者在上,重者在下为止。 (1)初始 ]为无序区。 (2)第一趟扫描 从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,
则交换二者的位置。即 依次比较(R[n], R[n-1]), (R[n-1], R[n-2]), (R[2], …, R[1]); 对于每对气泡(R[j+1], R[j]), R[j+1].key<R[j].key, 若
冒泡排序代码c语言则交换 R[j+1]和 R[j]的内容。 第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置 R[1]上。 (3)第二趟扫描 扫描 ]。扫描完毕时,"次轻"的气泡飘浮到 R[2]的位置上…… 最后,经过 n-1 趟扫描可得到有序区 ] 注意: 第 i 趟扫描时, R[1..i-1]和 ]分别为当前的有序区和无序区。 扫描仍是从无序区底部向上直至该区顶部。 扫描完毕时,该区中最轻气泡飘浮到顶部位置 R 上,结果是 R[1..i]变为新的有序区。
使用sum函数计算求和2、冒泡排序过程示例 对关键字序列为 49 38 65 97 76 13 27 49 的文件进行冒泡排序的过程
3、排序算法 (1)分析 因为每一趟排序都使有序区增加了一个气泡,在经过 n-1 趟排序之后,有序区中就有 n-1 个气泡,而无序 区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行 n-1 趟排序。 若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下 的原则, 因此, 冒泡排序过程可在此趟排序后终止。 为此, 在下面给出的算法中, 引入一个布尔量 exchange, 在每趟排序开始前,先将其置为 FALSE。
若排序过程中发生了交换,则将其置为 TRUE。各趟排序结束时 检查 exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。 (2)具体算法 void BubbleSort(SeqList R) { //R(l..n)是待排序
的文件,采用自下向上扫描,对 R 做冒泡排序 int i,j; Boolean exchange; //交换标志 for(i=1;i<n;i++){ //最多做 n-1 趟排序 exchange=FALSE; //本趟排序开始前,交换标志应为假 for(j=n-1;j>=i;j--) //对当前无序区 ]自下向上扫描 if(R[j+1].key<R[j].key){//交换记录 R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元 R[j+1]=R[j]; R[j]=R[0]; exchange=TRUE; //发生了交换,故将交换标志置为真 } if(!exchange) //本趟排序未发生交换,提前终止算法 return; } //endfor(外循环) } //BubbleSort 4、算法分析 (1)算法的最好时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 C 和记录移动次数 M 均达到 最小值:
Cmin=n-1 Mmin=0。 冒泡排序最好的时间复杂度为 O(n)。 (2)算法的最坏时间复杂度 若初始文件是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-i 次关键字的比较(1≤i≤n-1),且每次比较都 必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值: Cmax=n(n-1)/2=O(n2) Mmax=3n(n-1)/2=O(n2) 冒泡排序的最坏时间复杂度为 O(n2)。 (3)算法的平均时间复杂度为 O(n2) 虽然冒泡排序不一定要进行 n-1 趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差 得多。 (4)算法稳定性 冒泡排序是就地排序,且它是稳定的。
5、算法改进 上述的冒泡排序还可做如下的改进: (1)记住最后一次交换发生位置 lastExchange 的冒泡排序 在每趟扫描中,记住最后一次交换发生的位置 lastExchange,(该位置之前的相邻记录均已有序)。下一 趟排序开始时,R[1..lastExchange-1]是有序区,]是无序区。这样,一
趟排序可能使当 前有序区扩充多个记录,从而减少排序的趟数。具体算法【参见习题】。 (2) 改变扫描方向的冒泡排序 ①冒泡排序的不对称性 能一趟扫描完成排序的情况: 只有最轻的气泡位于 R[n]的位置,其余的气泡均已排好序,那么也只需一趟扫描就可以完成排序。 【例】对初始关键字序列 12,18,42,44,45,67,94,10 就仅需一趟扫描。 需要 n-1 趟扫描完成排序情况: 当只有最重的气泡位于 R[1]的位置,其余的气泡均已排好序时,则仍需做 n-1 趟扫描才能完成排序。 【例】对初始关键字序列:94,10,12,18,42,44,45,67 就需七趟扫描。 ②造成不对称性的原因 每趟扫描仅能使最重气泡"下沉"一个位置,因此使位于顶端的最重气泡下沉到底
部时,需做 n-1 趟扫描。 ③改进不对称性的方法 在排序过程中交替改变扫描方向,可改进不对称性。 回答者:cicihsk - 助理 二级 9-4 11:08
健身爬进电梯评价已经被关闭 好 75% (3)
目前有 4 个人评价 不好 25% (1)
其他回答
伦勃朗的作品《浪子回头》main()
共 3 条
{int i,j,n,a[10]; printf("输入 10 个数:"); for(i=0;i<10;i++) scanf("%d,",&a[i]);//记得输入的时候后面加“,” for(i=0;i<n-1;i++) for(j=i;j<n;j++) if(a[i]>a[j]) //改成(a[i] Array[j + 1] )
{
temp = Array[j];
Array[j] = Array[j + 1];
Array[j + 1] = temp;
}
}
html教程课件/* Prints an integer Array line by line */
void PrintArray( int Array[], const int Size )
{
int i;
for( i = 0; i < Size; i++ )
printf("Array[%i] = %i\n", i, Array[i] );
1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论