在學習c語言的過程中,在陣列內容中我們總是能學習到對一組資料進行排序,對於排序有許多的方法,像 (交換)氣泡排序、選擇排序、(基數)桶排序、(插入)二分法排序等等。
我主要以我個人的理解去分析常見的交換(冒泡)排序,同時本人也是個新手,希望能以我的手筆讓其他不懂的新手了解透這些排序。
交換(冒泡)排序:
又名為氣泡排序,即像水中的氣泡一樣冒出來,在陣列中陣列往一端移動可以形象說是冒泡,顧名思義啦。
下面就以 4 6 32 5 12 2 15 28 9 10 這10個數字為例,我們可以從小到大排序也可從大到小排序,原理都是一樣的。現就以從小到大排序為例。
如下圖、開始依次對相鄰兩個數進行比較,如果符合條件(此處從小到大排序,則是如果前乙個數大於後乙個數,那麼這兩個數字進行值的交換,否則保持值不變)則執行相應的操作。從圖中可以看出兩數比較最大的那個數就往後移(往後冒),這第一趟下來,最大的數就出來了,冒在陣列的末端。那麼就剩下前面的九個數進行兩兩比較了,相同的方式就可以依次找出第二大的數、第三大的數……這樣進行九趟比較,這組資料排序就好了。
**如下 :
#include"眾所周知,幾乎任何事物都有兩面性,好與壞、利與弊。那麼這種排序的弊端,相信大家從上圖應該看出來了。在第五趟的時候整個陣列是排序好了,但是呢程式還是往下執行。這樣不僅浪費時間,還占用空間(雖然現在計算機的空間大、運算速度也快)。同時這種方法在處理大量資料時可能吃不消,這裡只是10組數,就要比較9 趟。當然這個是可以進行優化的,我們可以加入乙個標示 flag 如果在之前的比較中進行了數值的交換則說明順序還沒有排好那麼繼續進行,否則就說明已經排序了,這裡就可以 break 了。**如下:stdio.h
"int main(void);
for(i = 9; i >= 0 ; i--)
for(j = 0; j <= i; j ++)
if(a[j] > a[j + 1])
for(i = 0; i < 10;i ++)
printf(
"%d
",a[i]);
}
#include"當然,這種排序方式的優點就是穩定,不管有多少陣列,只要給定足夠空間和時間,就能完整無誤地排序好。如果資料足夠大的話還是不怎麼推薦此排序方法。以上**中簡單以10個數為例對其進行排序,你可以依葫蘆畫瓢變更一下**中變數就可以了。stdio.h
"int main(void);
for(i = 9; i >= 0 ; i--)
if(flag == 0
)
break;//
如果標誌flag的值未變化,則說明已經排序好,那麼就可以終止了
flag = 0;//
重置flag 值以進行下一趟比較
}
for(i = 0; i < 10;i ++)
printf(
"%d
",a[i]);
}
C程式語言學習 氣泡排序
用某人的話說就是我們只要掌握氣泡排序就好了。原因有一下幾點 1 在使用陣列進行排序的情況下,其他的排序方法是可能快些,但是在資料量大的情況 2 但是資料量大肯定肯定不會使用陣列,肯定是使用鍊錶樹,這樣就不用排序演算法了。3 一般現實場景都是動態分配記憶體,所以也用不到陣列排序。4 如果要使用也是資料...
C語言 指標之交換
1.使用第三方變數進行交換,如下 include intmain 直接使用變數進行交換,在主函式中可直接實現變數值的交換,但是如果定義成函式,在呼叫時,無法通過形參或者返回值返回到主函式中,這時,就需要採取指標進行值的交換。2.使用指標交換,具體實現過程如下 include void swap in...
排序演算法之交換(冒泡與快排)
排序演算法根據是否需要訪問外存,分為內部排序和外部排序。使用記憶體,分為插入 直接插入排序 希爾排序 選擇 簡單選擇排序 堆排序 交換 氣泡排序 快速排序 歸併 基數。5.氣泡排序 效率很低,實現簡單 待排序列 3 1 4 2 第一趟排序結果 1 3 2 4 第二趟排序結果 1 2 3 4 第三趟排...