2017-08-16 43 views
3

我已經通過理解插入排序算法編寫了該代碼。我的老師說它的冒泡排序,但我的朋友說它是插入。有人可以檢查並簡要介紹一下。這個Bubble排序或插入排序在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; 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); 
} 
+1

這是插入/冒泡排序的最壞的版本。 – haccks

回答

4

看起來像兩個/既不適合我。它可能是插入排序,因爲您總是將第一個元素放入數組的未排序部分,並將其放入數組的排序部分中的正確位置。然而,插入不通過移動所有必要要素1元右,然後將選定的元素來糾正地方(我會說標準的插入排序一樣)完成的,而是它掉期選擇的元素與1元到左邊,直到選定的元素是在正確的地方。

因爲陣列的「劃分」和「未分類」的部分,我要說的插入排序。

因爲交換相鄰元素,我會說冒泡排序。

然而,它似乎更像是插入排序給我。如果不是(低效率)交換,你就不是僅僅向左移動元素的權利,只有最後寫所選元素向左(所選元素的最後,正確的位置),這將是一個很好的插入排序

+1

我同意你的意見。這個概念絕對是「插入排序」,但交換效率低下,這是可以避免的。另外''我'是''while'和'for'共享的,這使得效率更低。 –

0

這是一個Bubble Sort算法。只有Bubble Sort算法和你的算法之間的區別就是Bubble Sort算法等等,然後再排序最右邊的元素,你的算法是先選最左邊的元素。

分析:

你ALGO:

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

冒泡排序算法中:

------> 
-----> 
----> 
---> 
--> 
-> 
> 
+0

我不同意它只是左對齊/左對右的區別。在冒泡排序中,數組中的最後一個元素在外循環的每次迭代中移動到1個位置。在問題中,最後一個元素直到外循環的最後一次迭代才被完全移動。 –

+0

@TomášZahradníček是正確的,如果這與bubblesort相反,最小元素應該在第一個索引處。 – Hakes

2

爲您找到第一個不稱職創建有序塊我要說更接近排序在插入。而不是迭代整個陣列並將最大的元素推到末尾(如在冒泡排序中)

它更接近插入排序的標準版本,在那裏交換元素直到在排序的塊中找到正確的位置。但是,插入元素後,您會從錯誤的索引開始索引,因爲它已創建了一個已排序的子數組。

這有助於可視化的兩個分揀算法: https://visualgo.net/bn/sorting