經典排序方法詳解

2021-08-10 09:06:02 字數 3177 閱讀 3068

1.

交換排序法

首先我們來看一下最簡單但是複雜度高的交換排序法,這種方法每次比較一次都需要進行一次交換,但是是我們剛剛學習排序的乙個最基本的排序方法

例如 1 5 3 2 4五個數進行由大到小的降序排序

首先比較1 和 5 ,1小於5 這是一次比較,比較完成之後將1和5 進行一次交換;

排序函式如下

int dsort(int n,int a)

{int i,j;

int temp;

for(i=0;i這裡注意一下,這個函式和別的函式有點不一樣就是沒有return 返回值,而且在呼叫這個函式的時候

是這樣子呼叫 dsort(n,a),就是陣列直接寫頭名字就可以了不用寫作a;

2.選擇排序法

由於交換排序法的交換次數太多導致效率低下,於是我們更新了更好的排序方法,這種辦法每次迴圈比較之後只需要交換一次

它在比較完大小之後並不需要立即交換只需要用乙個中間變數將那個大的數(或者小的數)記錄下來

例如 1 5 3 2 4

在比較完1和5的大小之後不需要將1 5進行交換,只需要用乙個字元k記住當前最大的數k=2;

當比較完乙個迴圈之後再將最大的k和需要交換的數交換,也就是乙個迴圈只要交換一次,大大提高了排序的效率

**如下

int selectsort(int n,int a)

{int i,k,j;

int temp;

for(i=0;i最後那個比較k != i,只進行這一次交換

3.氣泡排序

氣泡排序和前面兩種排序的方法是不同的,雖然也是兩兩比較,通過判斷大小然後兩兩交換,但是比較的方法和交換都是不一樣的

下面我們先來看一下氣泡排序的交換辦法

經典排序演算法 - 氣泡排序bubble sort

原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,

這樣一趟過去後,最大或最小的數字被交換到了最後一位,

然後再從頭開始進行兩兩比較交換,直到倒數第二位時結束,其餘類似看例子

例子為從小到大排序,

原始待排序陣列| 6 | 2 | 4 | 1 | 5 | 9 |

第一趟排序(外迴圈)

第一次兩兩比較6 > 2交換(內迴圈)

交換前狀態| 6 | 2 | 4 | 1 | 5 | 9 |

交換後狀態| 2 | 6 | 4 | 1 | 5 | 9 |

第二次兩兩比較,6 > 4交換

交換前狀態| 2 | 6 | 4 | 1 | 5 | 9 |

交換後狀態| 2 | 4 | 6 | 1 | 5 | 9 |

第三次兩兩比較,6 > 1交換

交換前狀態| 2 | 4 | 6 | 1 | 5 | 9 |

交換後狀態| 2 | 4 | 1 | 6 | 5 | 9 |

第四次兩兩比較,6 > 5交換

交換前狀態| 2 | 4 | 1 | 6 | 5 | 9 |

交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

第五次兩兩比較,6 < 9不交換

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |

交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

第二趟排序(外迴圈)

第一次兩兩比較2 < 4不交換

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |

交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

第二次兩兩比較,4 > 1交換

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

第三次兩兩比較,4 < 5不交換

交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

第四次兩兩比較,5 < 6不交換

交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

第三趟排序(外迴圈)

第一次兩兩比較2 > 1交換

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

第二次兩兩比較,2 < 4不交換

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

第三次兩兩比較,4 < 5不交換

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

第四趟排序(外迴圈)無交換

第五趟排序(外迴圈)無交換

排序完畢,輸出最終結果1 2 4 5 6 9

氣泡排序執行外層第一輪迴圈之後,(外層總共執行n-1次迴圈),如果是公升序排序,則陣列中最大的乙個數放到了最後面(同理如果是降序排序,最小的那個數被放到了最後,)

然後內層迴圈第二次的時候就不需要比較倒數兩個數的大小,所以內層迴圈會少i次(即內層迴圈變為n-i-1次)

而不是(for(j=i;j冒泡的思想是(假設為從大到小排序):

順序掃瞄陣列元素,將相鄰兩個數進行比較,將大數調到前面,小數調到後面。

氣泡排序的特點是:

1.如果有 n 個數,則要進行 n - 1 輪排序;

2.在第 i 輪排序中,要進行 n-i 次兩兩比較

3.可以從前往後排序,也可從後往前排序

**如下

int bubblesort(int n,int a)

{int i,j,temp;

for(i=0;i

現在來說一下三種排序的區別

交換排序和選擇排序,是將第乙個元素先和第2,第3,......第n個數比較進行交換,然後第二層是第二個數和第3個,第4個.....第n個進行比較交換

選擇排序思想是一樣的,比較也是一樣的,只是減少了交換的次數

而氣泡排序,第一輪是將第乙個和第二個進行比較交換,然後將第二個和第三個進行比較交換.....將第n-1個和第n個進行比較交換,

第二輪同樣是從第乙個和第二個進行比較交換,只是這次不用比較到第n個數,因為第一輪之後,最後那個數一定會是最大(或最小),所以這次比較我們只需要比較到第n-2和第n-1個數。

經典排序之希爾排序詳解

希爾排序是希爾 donald shell 於1959年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序。首先我們知道直接插入排序的時間複雜度最低的時候應該是序列基本有序,效率最高,在待排序的記錄個數較少時,效率較高。基於這個基礎理論,...

經典排序之堆排序詳解

首先我們來看看什麼叫做堆排序?若在輸出堆頂的最小值之後,使得剩餘的n 1個元素的序列重新又構成乙個堆,則得到n個元素中的次小值,如此反覆,便能得到乙個有序序列,稱這個過程為堆排序。再來看看總結一下基本思想 將無序序列建成乙個堆 輸出堆頂的最小 大 值 使剩餘的n 1個元素又調整成乙個堆,則可得到n個...

詳解氣泡排序 經典與改進

兩兩比較相鄰的關鍵字,如果反序則交換,直到沒有反序的記錄為止。在這一過程中,較小的元素如同氣泡般慢慢浮到上面 正宗的冒泡演算法 public static comparable super anytype void bubblesort anytype a public static void sw...