五種C語言非數值計算的經常使用經典排序算法

摘要: 排序是計算機的一種操做方法,其目的是將一組「無序」的記錄序列調整爲「有序」的記錄序列,主要分爲內部排序和外部排序。

排序

排序是計算機的一種操做方法,其目的是將一組「無序」的記錄序列調整爲「有序」的記錄序列,主要分爲內部排序和外部排序。算法

(1)冒泡排序(起泡排序)

冒泡排序(Bubble Sort),其基本思路是,對於一組要排序的元素列,依次比較相鄰的兩個數,將比較小的數放在前面,比較大的數放在後面,如此繼續,直到比較到最後的兩個數,將小數放在前面,大數放在後面,重複步驟,直至所有排序完成。segmentfault

優勢:穩定;數組

缺點:慢,每次只能移動相鄰兩個數據。ide

假設要對含有n個數的序列進行升序排列,冒泡排序算法步驟是:函數

①從存放序列的數組中的第一個元素開始到最後一個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;spa

②第①趟結束後,最大數就存放到數組的最後一個元素裏了,而後從第一個元素開始到倒數第二個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;blog

③重複步驟①n-1趟,每趟比前一趟少比較一次,便可完成所求。排序

一、任意讀入10個整數,將其用冒泡法按升序排列後輸出。字符串

image

二、傳統方法:get

image

(2)選擇法排序

選擇排序法是每一趟在n-i+1i=12…n-1)個記錄中選取關鍵字最小的記錄做爲有序序列中第i個記錄。基於此思想的算法主要有簡單選擇排序、樹型選擇排序和堆排序。

優勢:移動數據的次數已知(n-1次);

缺點:比較次數多,不穩定。

選擇法排序是相對好理解的排序算法。假設要對含有n個數的序列進行升序排列,算法步驟是:

①從數組存放的n個數中找出最小數的下標(算法見下面的「求最值」),而後將最小數與第1個數交換位置;

②除第1個數之外,再從其他n-1個數中找出最小數(即n個數中的次小數)的下標,將此數與第2個數交換位置;

③重複步驟①n-1趟,便可完成所求。

一、任意讀入10個整數,將其用選擇法按升序排列後輸出。

image

二、傳統方法:

image

函數法:

image

(3)插入法排序

優勢:穩定,快;

缺點:比較次數不必定,比較次數越多,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表能夠解決這個問題。

要想很好地掌握此算法,先請了解「有序序列的插入算法」,就是將某數據插入到一個有序序列後,該序列仍然有序。插入算法參見下面的「數組元素的插入」。

一、將任意讀入的整數x插入一升序數列後,數列仍按升序排列。

image

插入法排序的要領就是每讀入一個數當即插入到最終存放的數組中,每次插入都使得該數組有序。

二、任意讀入10個整數,將其用插入法按降序排列後輸出。

image

(4)歸併排序

歸併排序(MERGE-SORT)是創建在歸併操做上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併

即將兩個都升序(或降序)排列的數據序列合併成一個仍按原序排列的序列。

一、有一個含有6個數據的升序序列和一個含有4個數據的升序序列,將兩者合併成一個含有10個數據的升序序列。

image

(5)字符數組:(逆序排列)如:

一、把輸入的字符串逆序排列,如輸入ABCDE,輸出爲EDCBA

image

本文分享自華爲雲社區《C語言非數值計算經常使用經典算法之排序》,原文做者:Jack20。

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索