五種排序的思想及其基本實現
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...