C 这是冒泡排序还是插入排序?

C 这是冒泡排序还是插入排序?,c,C,我通过理解插入排序算法编写了这段代码。我的老师说是气泡式的,但我的朋友说是插入式的。有人能检查一下并向我简要介绍一下吗 #include <stdio.h> void sort(int n) { int i, j; float arr[n], k; for (i = 0; i <= n - 1; i++) { printf("Enter the number"); scanf("%f", &arr[i]); } for (i = 1

我通过理解插入排序算法编写了这段代码。我的老师说是气泡式的,但我的朋友说是插入式的。有人能检查一下并向我简要介绍一下吗

#include <stdio.h>
void sort(int n) {
  int i, j;
  float arr[n], k;
  for (i = 0; i <= n - 1; i++) {
    printf("Enter the number");
    scanf("%f", &arr[i]);
  }

  for (i = 1; i <= n - 1; i++) {
    j=i
    while (arr[j] < arr[j - 1] && j > 0) {
      k = arr[j - 1];
      arr[j - 1] = arr[j];
      arr[j] = k;
      /*printf("\n\t%f",arr[j]);*/
      j--;
      /*printf("\n%d",j);*/
    }
    /*printf("\n%d",x[i]);*/
  }
  for (i = 0; i < n; i++) {
    printf("\n%f", arr[i]);
  }
}

int main() {
  int t;
  printf("Enter the number of values to be sorted");
  scanf("%d", &t);
  sort(t);
}
#包括
无效排序(整数n){
int i,j;
浮动arr[n],k;

for(i=0;i对我来说看起来两者都不一样。它可能是插入排序,因为您总是在数组的未排序部分中取第一个元素,并将其放置在数组的已排序部分的正确位置。但是,插入不是通过将所有必要的元素向右移动1个元素,然后将选定的元素插入到正确的位置来完成的(我想说的是,标准的插入排序是这样的),但它会将所选元素与左侧的1个元素交换,直到所选元素位于正确的位置

由于数组的“排序”和“未排序”部分,我会说插入排序

由于交换了相邻元素,我会说是冒泡排序


然而,在我看来,这更像是插入排序。如果不是(低效的)交换,您将只将左元素移到右,并且只最终将所选元素写入左(所选元素的最终正确位置),这将是一个很好的插入排序

这是一个
冒泡排序
算法。
冒泡排序
算法和您的算法之间的唯一区别是
冒泡排序
算法先排序最右边的元素,然后依次排序,您的算法先排序最左边的元素

分析:

你的算法:

<---------
 <--------
  <-------
   <------
    <-----
     <----
      <---
       <--
        <-
         <

我想说的是更接近插入排序,因为您通过查找第一个不匹配项来创建排序块。而不是迭代整个数组并将最大的元素推到末尾(如冒泡排序)

它更接近插入排序的标准版本,即交换元素直到在已排序的块中找到正确的位置。但是,插入元素后,索引从错误的索引开始,因为它创建了一个已排序的子数组

这有助于可视化两种排序算法:

这是插入/冒泡排序的最差版本。我同意你的观点。这个概念肯定是
插入排序
,但交换效率低下是可以避免的。另外
I
while
for
之间共享,这会导致进一步的效率低下。我不同意它只是从右到左/左右差为t。在冒泡排序中,数组中的最后一个元素在外循环的每次迭代中向上移动到1个位置。有问题的是,直到外循环的最后一次迭代,最后一个元素才移动。@TomášZahradníček是对的,如果这是bubblesort的相反结果,则最小的元素应该位于第一个索引处。
------>
----->
---->
--->
-->
->
>