一.氣泡排序
簡單來說就是兩兩比較,把大的數換到後面,小的數換到前面,一輪比較後,最大的數就排到了最後面,
總共要比較n-1輪,氣泡排序是一種穩定排序演算法,即使兩個數相等,也不會破壞它們原有位置。
二.快速排序
簡單來說就是選定乙個基準值,一般選取最後乙個數為基準值,然後定義兩個引數start,end,
start從第一位開始掃瞄,end從最後一位開始掃瞄(包括基準值),如果start找到比基準值大的數,end找到比基準值小的數,就把兩個位置交換一下,直到start與end相等,把start位置上的數與基準值相交換,這樣左邊的數都比基準值小,右邊的數都比基準值大,然後遞迴(0,start-1),(start+1,end)。
三.選擇排序
從第一位開始掃瞄一輪陣列,找到最小值的位置,把最小值和第一位位置互換,然後從第二位開始掃瞄一輪陣列,同樣找到最小值,然後和第二位互換…可以看出這是乙個遞迴,遞迴終止條件就是當掃瞄開始的位置start等於end。
四.插入排序
簡單來說就是把第一位看成已經排好的有序陣列,從第二位開始,每一次都把即將進入有序陣列的數和前面的有序陣列進行比較,找到insert place,比如(data,start,end),data表示要排序的陣列,在這個陣列裡面,data[0]到data[start-1]都是排好的,data[start]到data[end]都是未排好順序的。那麼insert place就屬於0到start,找到後,把data[start]插入insert place 處,後面的數依次向後移動乙個位置。熟悉遞迴的應該也能看出這個也可以用遞迴實現,遞迴終止條件就是start>end。
五.歸併排序
歸併排序就是講求乙個先「」分「,後「合」,每次都把陣列分成兩部分,一次次分下去直到,各個部分只有乙個元素,再兩兩合併排序,所以「分」的思想就是divide(data,first,last)---->merge(data,first,mid),merge(data,mid+1,last).「合」的思想combine(int data,int first,int mid,int last)
分別掃瞄左半部分和右半部分:first->mid mid+1->last,兩兩比較,把小的數放到乙個新的陣列中去。中間必然會出現兩部分之間會有一部分正好分配完畢(也就是沒有元素了),那麼這時候就把剩下部分整個打包貼上到新陣列後面。
六.全排列
總的來說非常簡單的乙個思路,(char* str,int first ,int last),first也就是第乙個元素,last也就是最後乙個元素,然後舉個例子123,首先確定第乙個位置的元素就是1,2,3這三種可能,怎麼實現的呢?就是把第乙個字母依次和第一,第二,第三個元素換一下位置,你肯定會疑問為什麼要和自己互換呢?這不是多此一舉嗎?其實關鍵在於下一步的遞迴,我們傳進去的是(str,first+1,last),所以如果沒有那個和自己互換的話,那麼23子串永遠也不可能會進入遞迴,記得遞迴完,要恢復原狀.然後遞迴終止條件就是當first==last,那麼就可以直接輸出str啦。
七.**
#include
#include
#include
void
quicksort
(int data,
int start,
int end)
;//快排
void
choosesort
(int data,
int start,
int end)
;//選擇排序
void
insertsort
(int data,
int start,
int end)
;//插入排序
void
merge
(int data,
int first,
int mid,
int last)
;void
mergesort
(int data,
unsigned
int first,
unsigned last)
;//歸併排序
void
allarrange
(char
* str,
int,
int)
;void
swap
(int
&a,int
&b)//交換兩個數
intmain()
;mergesort
(nums,0,
9);//測試各個排序演算法,直接改名字就夠了
for(
int i =
0; i <10;
++i)
printf
("%d "
, nums[i]);
/*char str = "abcd";
allarrange(str,0,3);*/
return0;
}void
quicksort
(int data,
int start,
int end)
int pivor = end;
while
(startwhile
(data[end]
>= data[pivor]
&& start < end)
if(start < end)
}swap
(data[start]
, data[pivor]);
quicksort
(data,
0, start -1)
;//遞迴左半部分
quicksort
(data, start +
1, pivor)
;//遞迴右半部分
}void
choosesort
(int data,
int start,
int end)
swap
(data[start]
, data[min_index]);
choosesort
(data, start +
1, end)
;//把排好的數除外,繼續遞迴排序
}void
insertsort
(int data,
int start,
int end)
//start和end表示無序序列,0->start-1表示有序}if
(insertplace != start)
//有位置可以放入,先把前面的都向後移動一格,空出位置放進去
data[insertplace]
= index;
}++start;
//必須要有,不然下面遞迴會出錯
insertsort
(data, start, end);}
void
merge
(int data,
int first,
int mid,
int last)
else
tmp[i]
= data[right_low++];
}if(left_low <= left_high)
if(right_low <= right_high)
for(k =
0; k <= last-first;
++k)
data[first+k]
= tmp[k]
;free
(tmp)
;//釋放記憶體,要注意
return;}
void
mergesort
(int data,
unsigned
int first,
unsigned last)
void
allarrange
(char
* str,
int first,
int last)
else
}return
;}
演算法學習(五) 基本排序演算法總結
前幾天學習幾個基本的排序演算法,下面來總結一下 在維基百科上有排序演算法的一張圖,紅線是我之前總結學習的。從我們學習的排序演算法中可以分為兩類 簡單排序有冒泡 選擇 插入排序 改進演算法有希爾 堆排序 歸併排序和快速排序。快速排序是冒泡的公升級版,屬於交換排序 希爾排序是直接插入排序的公升級,屬於插...
演算法學習總結 五 快速排序
一 演算法簡介 快速排序 quicksort 是對氣泡排序的一種改進。它的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。二 演算法描述...
排序演算法學習
一直都想把排序和搜尋類的演算法總結一下,一直拖著沒寫,主要是太懶了,現在決定還是要再好好學習下這些基本的演算法。畢竟基礎真的是很重要。好了現在開始學習第乙個排序演算法 插入排序 我記得插入排序在我們以前的資料結構教程上是第乙個介紹的 插入排序 聽這個排序名字就是將乙個什麼數要插入到某個地方,不錯,他...