五種排序的思想及其基本實現

2021-07-11 10:56:32 字數 3845 閱讀 1202

五種排序的思想及其基本實現

1. 簡介:

這兩天重學了氣泡排序、插入排序、選擇排序、歸併排序、快速排序,這五種排序,現就學到知識做以總結,我的**風格有所變化,注釋不僅成塊出現,而且用了英語,語句中的空白運用也有所變化。

2. 演算法分析

a. 氣泡排序

在序列中從左到右比較相鄰的兩個元素,若右邊元素小於左邊元素則交換(從小到大);

依次遍歷比較至指定的位置(冒泡點),同步將最大元素交換至冒泡點,完成一次冒泡;

冒泡點的順序是從第n個元素位置到第2個元素位置。

偽演算法1> loop( 由大到小遍歷冒泡點 [1..n], p )

2>        loop( 遍歷冒泡點前的元素 [0..p] )

3>            比較當前元素與下一元素的大小,若當前元素大於下一元素則交換

b. 插入排序

將原序列劃分為'有序序列'與'無序序列'兩個序列;

遍歷無序序列,取出當前元素,插入至有序序列中;

當無序原陣列遍歷完成時,插入排序完成。

偽演算法1> 將原序列分為兩個序列,'有序序列'僅含第乙個元素,'無序序列'包含剩下的元素。

2> loop( 遍歷無序序列,取出當前元素[1..n], p )

3>        loop( 遍歷有序序列,確定插入點[0..p] )

4>        移動有序陣列中資料,為有序序列開闢空間

5>        複製入資料

c. 選擇排序

將原序列劃分為'有序序列'與'無序序列'兩個序列;

在無序序列中找到最小(從小到大排序)的元素, 將其追加到有序序列中, 並在無序序列中刪除該元素。

當無序序列為空時,選擇排序完成。

偽演算法1> 將原序列分為兩個序列,'有序序列'為空,'無序序列'為原序列。

2> loop( 無序序列不為空 )

3>        loop( 遍歷無序序列,取出最小元素 )

4>            取出當前最小元素,交換至有序序列尾

d. 歸併排序

將有n個元素序列的排序問題,劃分為2個有n/2個元素序列的排序問題, 再有序連線這2個序列;

再將其劃分為4個有n/4個元素序列的排序問題, 再有序連線這4個序列;

......

最終劃分成有n/2個有2個元素序列的排序問題, 再有序連線這n/2個序列;

排序完成

偽演算法1> 把n個元素分為兩個長度為n/2的元素陣列。

2> 歸併排序前n/2個元素。

3> 歸併排序後n/2個元素。

4> 將兩個排好序的邏輯陣列合併成乙個有序陣列。

e. 快速排序

確定乙個元素在序列中的有序位置,使其作為分割點,讓其左邊序列小於它,讓其右邊序列大於它;

再將左右序列分別取有序分割點,將原序列分成四個序列;

......

最終將n個元素的序列分成,n個序列,確定n-1個有序分割點;

排序完成。

偽演算法1> 將第乙個元素在序列中的位置確定。

2> 快速排序該位置前面的序列。

3> 快速排序該位置後面的序列。

3. 程式實現

/*

* 五種排序思維基本實現

* */

# include # define len 10

/* 氣泡排序

* */

void bubble_sort( int *base, int len );

/* 插入排序

* */

void insert_sort( int *base, int len );

/* 選擇排序

* */

void select_sort( int *base, int len );

/* 歸併排序

* */

void merger_sort( int *base, int start, int end );

/* 快速排序

* */

void quick_sort( int *base, int start, int end );

int

main( void )

; //bubble_sort( tmp, len );

//insert_sort( tmp, len );

//select_sort( tmp, len );

//merger_sort( tmp, 0, len - 1 );

quick_sort( tmp, 0, len - 1 );

print( tmp, len );

return 0; }/*

* function: print the valuse arr

* */

void

print( int *base, int len )

/* function bubble

* */

void

bubble_sort( int *base, int len )

return;

}/* function insert;

* */

void

insert_sort( int *base, int len )

return;

}/* function select

* */

void

select_sort( int *base, int len )

//printf( "no.%d select the min value is %3d , arr is ", i, base[i] );

//print( base, len );

} return;

}/* function merger

* */

void

merger_sort( int *base, int start, int end )

}/* sub function to merger_sort

* */

void

merger( int *base, int start, int mid, int end )

/* function: used start and end columns, printf a sub array from a array.

* */

void print_sub( int *base, int start, int end )

/* function quick

* */

void

quick_sort( int *base, int start, int end )

}/* sub function to quick_sort

* */

intpartition( int *base, int start, int end )

else

end--;

/*second left */

while (end > start)

if (base[start] > tmp) else

start++;

} base[end] = tmp;

return end;

}

writer:  anden       email:  [email protected]      time:  2016.04.26

五種基本排序

最近在看資料結構,想把幾個簡單的排序在過一遍,發現還沒那麼容易,最簡單的氣泡排序 沒那麼容易敲出來。下面把5種排序複習一下 1.氣泡排序 氣泡排序是最簡單也是最常用的排序方法。其基本思想是 以公升序為例 將序列看成一排豎著的氣泡。最後乙個元素與倒數第二個元素進行比較,小的往前拱,再將倒數第二個元素與...

桶排序思想及其簡單實現(C )

桶排序,就是利用桶進行排序。什麼是桶呢?這裡不要把它想複雜了,桶並不是乙個新的高大上的資料結構,它只是乙個裝元素的容器。比如現在有乙個待排序的陣列a array 不難發現,其中的元素值均處在0 20之間,那我們不妨設計四個桶,其中所裝元素值分別為 0,5 5,10 10,15 15,20 之間。顯然...

五種排序演算法實現

五種排序演算法實現 classsorter intt arr min arr min arr i arr i t 氣泡排序法實現 publicvoidsort2 intarr j privatevoidswap refintl,refintr 快速排序法實現 publicvoidsort3 intl...