第一次寫部落格希望能寫的好一點把~~~
回顧了一下幾種經典的排序演算法:氣泡排序、選擇排序、快速排序、插入排序。**
氣泡排序是一種簡單的排序演算法,它通過從前往後比較相鄰元素,使得較大的數向後「冒」。每一趟可以確定乙個最大的數。 相當於在末尾不斷排乙個反向的降序序列。
從前往後比較相鄰的元素,如果前乙個元素比後乙個元素大,則交換。
重複上一步,除了最後乙個元素(已經是最大的了)。
void
bubble_sort
(int data)
}}}
選擇排序是比較直觀的排序演算法,它的基本思想是:每次選擇乙個最小的數放到前面已經排好的序列的末尾。與氣泡排序相比,選擇排序像是在序列頭部逐步排乙個正向的公升序序列。
設立乙個標記k代表當前的位置,從前往後遍歷序列,當遍歷到第j個元素時,尋找j之後的序列中最小的元素,將其與第j個元素交換位置,直至結束。
void
selection_sort
(int data[n])}
int temp = data[i]
; data[i]
= data[index]
; data[index]
= temp;
}}
插入排序也是一種比較直觀的排序演算法,與選擇排序不同的是:
插入排序每次是直接拿後乙個元素,然後在前面尋找適合的位置進行插入。
而選擇排序則是在後面的序列中找最小的元素,然後放在前面序列的末尾。
那麼它的演算法思路也比較清晰了。
1.從第2個元素開始,向後遍歷直到結束,每遍歷乙個數轉第2步。記遍歷到的元素為x。
2.從第1個元素開始向後遍歷,找到第乙個比x大的元素y,將x插在y前面,返回1 。如果遍歷到x還沒有找到,則返回1。
因為不想寫陣列(只是不想搞後移元素這一步)所以用結構體鍊錶的形式寫了。
struct node//結構體定義,單向鍊錶
;void
init
(node * head)
//初始化鍊錶 帶頭節點!!
}void
insertion_sort
(node *head)
//具體的操作函式拉
pred_temp = pred_temp-
>next;
temp = temp-
>next;
} p =p-
>next;if(
!ju)pred_p = pred_p-
>next;
//當沒有找到時,
}}
簡單解釋一下標記ju的作用(大佬手下留情)
1.當在前面找到了比當前元素大的元素時,因為要將當前元素插入到前面,相當於刪除當前結點,且在前面對應位置插入乙個結點,所以這個pred_p是不變的。
2.當前面沒找到的時候,相當於當前元素的位置時適合的,所以,pred_p要隨著p一起前移。(當然如果你是用陣列做的,就不用搞這個拉,但鍊錶需要分類討論。)
快速排序的思想是分治,通過乙個基準元素將原序列分為兩個大小序列,然後遞迴對新的序列進行同樣的操作。
1.在序列中選擇乙個基準元素x,將比x小的元素放在x的前面,將比x大的元素放在x的後面。
2.分別將基準元素前後兩個序列執行第1步的操作。直至子串行長度為1或者0。
void
sort_quick
(int data,
int left,
int right)
data[left]
= temp;
left++
;//基準元素現在後移了一位}}
sort_quick
(data, left_t, left-1)
;//對左邊的序列遞迴
sort_quick
(data, left+
1, right)
;//對右邊的序列遞迴
}
上述**直接將序列第乙個元素作為基準。
如有錯誤,歡迎指正,謝謝!
幾種簡單的排序演算法
整理了一下幾種簡單的排序演算法,暫時先貼上演算法,以後有時間在乙個乙個注釋 參考 下面是 部分 include 演算法1 氣泡排序,時間複雜度o n 2 基本思想 從最後乙個數開始,每次相鄰兩個數字比較,較小數往上浮動 void bubblesort int a,int c 演算法2 選擇排序,時間...
幾種簡單的排序演算法
1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 直接選擇排序 堆排序 4 歸併排序 5 分配排序 基數排序 所需輔助空間最多 歸併排序 所需輔助空間最少 堆排序 平均速度最快 快速排序 不穩定 快速排序,希爾排序,堆排序。1.直接插入排序 1 基本思想 在要排序...
幾種簡單的排序演算法總結
注 1 以下所有排序演算法均按照從小到大的順序排列 2 以下演算法中用到的交換函式都一樣,如下 void swap int a,int i,int j 因此不在每個排序演算法中進行詳解 1.氣泡排序 1.最簡單的氣泡排序 思想 該排序演算法在排序的過程中總共進行n 1趟排序,每一趟排序都將當前的關鍵...