插入排序-c语言else break;的问题

问题描述

c语言else break;的问题

用插入排序法对10个数进行降序排列

#define A 10
#include <stdio.h>
int main()
{
    int a[A+1],i,j,t;
    for(i=1;i<=A;i++)
    scanf("%d",&a[i]);
    for(i=2;i<=A;i++)
    {for(j=i-1;j>=1;i--,j--)
    if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}
**  else break;**
    }
    for(i=1;i<=A;i++)
    printf("%d ",a[i]);
    printf("n");
    return 0;
}

中间这个 else break;必须要加上吗?我觉得不用呀,,因为如果不满足if的话应该能进行下一次循环呀,,,可我去掉之后运行不了。。。为啥

解决方案

你不觉得你的这个程序已经进入一个死循环了吗。。。。。那个break只是纠正这个死循环,让你误以为程序是没有问题的,但是实际的问题是:
因为你的i是在循环体外面申明的变量,所以在你的嵌套循环中,里面循环结束后,i的值都会减小为1,然后外层循环又给i加了1,到了里面的循环
又减小到1,于是就无限循环了下去。。。。。

解决方案二:

必须加。内层有个i--,影响到外层循环。如果没有break,内层总会i--,外层i++,就会进入死循环。
你自己找10个数,单步执行几个循环就明白了。

时间: 2024-11-16 00:53:03

插入排序-c语言else break;的问题的相关文章

浅析直接插入排序与折半插入排序_C 语言

首先看一下例子,将数据一个个的插入到一个列表中,插入后这个列表就排序好了 注意:这个列表是递增的,而且内存空间已分配好,只是没有填充真正的数据,如下代码: 复制代码 代码如下: int InsertSort(MergeType *L, int data){ int j;  if (!L->len) {  L->elem[++L->len] = data;  return 0; }  for (j = L->len-1; j >= 0; --j) {  if (data <

c++几种基本的插入排序(图文)_C 语言

1.插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 时间复杂度:O(n^2); 算法描述: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果

C语言实现选择排序、直接插入排序、冒泡排序的示例_C 语言

选择排序选择排序是一种简单直观的排序算法,其核心思想是:遍历数组,从未排序的序列中找到最小元素,将其放到已排序序列的末尾. 时间复杂度:O(n^2) 稳定性 :不稳定 /* * @brief selection sort */ void selection_sort(int a[], int n) { int i, j, min, tmp; for (i = 0; i < n - 1; ++i) { min = i; for (j = i+1; j < n; ++j) { if (a[j] &

C 语言插入排序算法及实例代码_C 语言

插入排序是排序算法的一种,它不改变原有的序列(数组),而是创建一个新的序列,在新序列上进行操作. 这里以从小到大排序为例进行讲解. 基本思想及举例说明 插入排序的基本思想是,将元素逐个添加到已经排序好的数组中去,同时要求,插入的元素必须在正确的位置,这样原来排序好的数组是仍然有序的. 在实际使用中,通常是排序整个无序数组,所以把这个无序数组分为两部分排序好的子数组和待插入的元素.第一轮时,将第一个元素作为排序好的子数组,插入第二个元素:第二轮,将前两个元素作为排序好的数组,插入第三个元素.以此类

浅谈2路插入排序算法及其简单实现_C 语言

2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好的理解辅助空间中最大值和最小值的位置了. 算法整体思想还是很简单的,直接贴出可运行代码,注释还是挺清楚的,大家直接看就ok了 C语言实现示例 #include <stdio.h> #include <stdlib.h> void insert_sort(int *arr, int *t

直接插入排序(带哨兵和不带哨兵)

前言 插入排序(insertion sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止.   直接插入排序 基本思想 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2..n].从i = 2起直到i = n 为止,依次将R[i]插入当前的有序区R[1..i - 1]中,生成含n个记录的有序区.   排序方法 将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i

SystemVerilog语言简介(三)

15. 强制类型转换   Verilog不能将一个值强制转换成不同的数据类型.SystemVerilog通过使用'操作符提供了数据类型的强制转换功能.这种强制转换可以转换成任意类型,包括用户定义的类型.例如:     int' (2.0 * 3.0) // 将结果转换为int类型   mytype' (foo) // 将foo转换为mytype类型       一个值还可以通过在强制转换操作符前指定一个10进制数来转换成不同的向量宽度,例如:   17' (x - 2) // 将结果转换为17位

Ruby中的return、break、next详解_ruby专题

return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意. return 常用方式 通常情况下的return语句和大家理解的意思是相同的. 复制代码 代码如下: def m1 param   if param == 1     return 'returned 1'   end 'returned default value'#根据Ruby语言规范,最后一条执行语句的结果将作

编程-求助C语言中的return问题

问题描述 求助C语言中的return问题 麻烦大家解释一下return在不同返回值下的含义是什么?比如return 0: return -1: return 1: return :(哈有这个测试用例:int ret = 0,if(传过来的地址为NULL) return ret).希望大家能帮我详细地讲一下return的具体含义及其用法,谢谢大家! 解决方案 return的使用方法有两种: 1.return -- 例如return 1; 例如return res[1]; 例如return "hel