2017-06-18 49 views
-1

我是相當新的C和編程一般,和我有一個關於在以下冒泡排序功能循環問題:試圖瞭解冒泡功能

void sort(int values[], int n); 
    { 
     int c, d, t; 

     for (c = 0; c < (n - 1); c++) 
     { 
      for (d = 0; d < c - n - 1; d++) 
      { 
       if (values[d] > values[d + 1]) 
       { 
        t = values[d]; 
        values[d] = values[d + 1]; 
        values[d + 1] = t; 
       } 
      } 
     } 
    } 

說我特別想了解的部分是用於循環所述第二:

for (d = 0; d < c - n - 1; d++) 

據我所知,功能是通過陣列每次迭代,最多比較並排側的值,直到最後排序元件和冒泡的最大元素到所述陣列的所述端;然而,我似乎無法將我的頭圍繞在:

while d < c - n - 1; 

以及它如何轉換。當我在腦海裏玩這個時,我想象的是,在第一次循環時,c-n-1等於0 0在我看來,由於c總是小於n - 1,從c中減去n - 1總是會導致小於0的值,並且d永遠不會小於0,所以永遠不會執行。我知道我只是看着這個錯誤,當答案被提出時,可能會有一個'嘟嘟'的時刻,但是這讓我很困擾。

如果我把第一個for循環放入單詞中,它說:while c小於數組的長度,執行這個循環的內容然後遞增c。有人能以類似的方式將第二個循環放入單詞中,解釋d < c - n - 1的含義嗎?

+3

此代碼不起作用。它從哪裏來的?認爲它起作用的基礎是什麼? – hvd

+2

是的,代碼不起作用,因爲第二個循環從不迭代。我認爲第二個循環中的正確條件是'd

回答

0

試試這個代碼,而不是。

#include<stdio.h> 

void sort(int values[], int n) 
{ 
int c,d,t=n; 
//if we have n elements then outer loop must iterate for n times. 
for(c=0;c<n;c++) 
{ 
    /*after every complete iteration we get a 
    sorted element in last position, next iteration 
    will be one less, so we assigned value of n into t 
    and we will decrease it by 1 after every internal complete iteration. 
    */ 
    for(d=0;d<t-1;d++) 
     { 
      if(values[d]>values[d+1]) 
      { 
       int temp; 
       temp = values[d+1]; 
       values[d+1] = values[d]; 
       values[d] = temp; 
      } 
     } 
    //decrease the test cases in next iteration, 
    //we already have last element sorted. 
    t--; 
    } 
} 
int main() 
{ 
    int i; 
    int values[]={24,12,2,4,6}; 
    sort(values, 5); 

    for(i=0; i<5; i++) 
    { 
     printf("%d\n",values[i]); 
    } 

return 0; 
} 

根據您的需要進行更改。

-1

不要把簡單的事情複雜,也是你的代碼不起作用試試下面code.`

void sort(int values[], int n); 
     { 
      int c, d, t; 
// since c is intitalised to 0 u can simply use n 
     for (c = 0; c < n; c++) 
     { 
//Assign d = c+1 instead of doing it in next step 
      for (d = c+1; d < n; d++) 
      { 
//It is ascending sort it checks first and second value ,if greater it will swap 
       if (values[c] > values[d]) 
       { 
        t = values[c]; 
        values[c] = values[d]; 
        values[d] = t; 
       } 
      } 
     } 
    }` 
+0

嗯考慮一下,'values [0]'引用的唯一時間是第一次'if(values [c]> values [d])'被執行。如何將最小值存儲在'values [0]'中?即使有一個簡單的3,2,1數組?這「泡沫」的方式是錯誤的。 – chux

+0

因爲(d = c + 1; d

0

首先來看看這個QA

其中我的功能性氣泡排序C++ imp可以在包含評論的地方找到可供瀏覽的內容。

由於數組中的最後一個值已經從上一次運行中排序,因此您的第一個循環應該每次使用少一個數組大小來循環冒泡排序。

所以第二個循環應該在範圍<0,n-1-c>if語句只是選擇如果排序是ascdesc和交換元素(如果需要)。

最喜歡的泡沫種類在那裏你忘停止時排序完成的(上次運行期間不發生任何交換)