排序演算法是演算法中的基礎,今天我來用自己的話說下三種最基本的演算法,理解了這三種基本的演算法就可以進一步學習怎麼優化排序演算法了。呵呵,廢話不多說,咱們開始。
簡單選擇排序演算法:
簡單選擇排序的基本思想是:一次選定陣列中的乙個數,記下當前位置並假設它是從當前位置開始後面數中的最小數min=i,從這個數的下乙個數開始掃瞄直到最後乙個數,並記錄下最小數的位置min,掃瞄結束後如果min不等於i,說明假設錯誤,則交換min與i位置上數。(也即:每次從數列中找出乙個最小的數放到最前面來,再從剩下的n-1個數中選擇乙個最小的,不斷做下去。)
簡單選擇排序演算法的關鍵:1.每一趟在n-i+1中選取最小的記錄 2.通過n-i次關鍵字進行比較 3.總共需要n(n-1)/2次比較 4.選擇排序演算法的時間複雜度是「死」的,也就是o(n^2)
演算法**:
code:
#include
voidselectsort(int*a,intlen)//簡單選擇排序演算法*a為陣列len為陣列長度
} if(k>=i)//一輪結束後,把k認為的最小值和i進行交換
} } intmain(void)
selectsort(a,10);
for(inti=0;i<10;i++)//輸出排序後的數
} }插入排序:
插入排序基本思想是:假設待排序的記錄存放在陣列r[1..n]中。初始時,r[1]自成1個有序區,無序區為r[2..n]。從i=2起直至i=n為止,依次將r[i]插入當前的有序區r[1..i-1]中,生成含n個記錄的有序區。
(也就是:每次從數列中取乙個還沒有取出過的數,並按照大小關係插入到已經取出的數中使得已經取出的數仍然有序。)
演算法**:
code:
#include
voidinsertsort(int*a,intlen)
a[j]=x;//假如第一次排序的話,這邊的a[j]=a[0],然後把x的值賦給它
} }
intmain(void)
insertsort(a,10);
for(inti=0;i<10;i++)//輸出排序後的數
} }插入演算法圖示:
氣泡排序:
氣泡排序的基本思想:將被排序的記錄陣列r[1..n]垂直排列,每個記錄r[i]看作是重量為r[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r:凡掃瞄到違反本原則的輕氣泡,就使其向上"飄浮"。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(也即:分為若干趟進行,每一趟排序從前往後比較每兩個相鄰的元素的大小(因此一趟排序要比較n-1對位置相鄰的數)並在每次發現前面的那個數比緊接它後的數大時交換位置;進行足夠多趟直到某一趟跑完後發現這一趟沒有進行任何交換操作(最壞情況下要跑n-1趟,這種情況在最小的數字於給定數列的最後麵時發生)。事實上,在第一趟冒泡結束後,最後面那個數肯定是最大的了,於是第二次只需要對前面n-1個數排序,這又將把這n-1個數中最小的數放到整個數列的倒數第二個位置。這樣下去,氣泡排序第i趟結束後後面i個數都已經到位了,第i+1趟實際上只考慮前n-i個數(需要的比較次數比前面所說的n-1要小)。這相當於用數學歸納法證明了氣泡排序的正確性:實質與選擇排序相同。)
通俗的說:在排隊時,按個子高的和個子矮的進行比較,兩兩進行比較
**實現:
code:
#include
voidbubbletsort(int*a,intlen)//*a傳進來的陣列len為陣列的長度
} } }
intmain(void)
bubbletsort(a,10);
for(inti=0;i<10;i++)//輸出排序後的數
} }冒泡演示圖:
大家是不是想,選擇排序和氣泡排序差不多哈,那他們的區別是哪呢?
冒泡演算法,每次比較如果發現較小的元素在後面,就交換兩個相鄰的元素。而選擇排序演算法的改進在於:先並不急於調換位置,先從a[1]開始逐個檢查,看哪個數最小就記下該數所在的位置p,等一躺掃瞄完畢,再把a[p]和a[1]對調,這時a[1]到a[10]中最小的資料就換到了最前面的位置。所以,選擇排序每掃瞄一遍陣列,只需要一次真正的交換,而冒泡可能需要很多次。比較的次數是一樣的。
一般是選擇排序的平均時間複雜度比氣泡排序的稍低:
.................................若大家有什麼有關問題可以提出,謝謝!。。。。
下面是 用自己語言理解排序演算法(希爾排序) 【二】
演算法 選擇 插入 氣泡排序
選擇排序,就是每次選擇未排序中最小的,放到第i個位置。比如第一次,遍歷整個陣列,找到陣列中最小的,放到第乙個位置 第二次從第2個元素開始遍歷,找到最小的,放到第2個位置 以此類推,流程如下。輸出結果 012 3568 9插入排序,第一次迴圈,當做0 0號位置已經排好序,需要做的是從0 1號位置排序,...
排序演算法 冒泡 選擇 插入排序
本文簡單總結一下三大排序演算法,如有不足,請多多提意見。簡述 從小到大排序,每次比較兩個元素,看他們的順序有沒有錯,如果錯了就換過來。a 比較abc.元素,如果第乙個比第二個大,則將兩個元素交換位置 bac.再依次將a和c進行比較。b 對每一對相鄰的元素做同樣的工作,從第一對到最後一對。這一次執行完...
排序演算法 冒泡 選擇 插入排序
外層迴圈控制大排序次數,內層迴圈控制每次大排序的排序次數 一次大排序就可以把最小的資料放在最前面。1 對陣列中的各資料,依次比較相鄰的兩個元素的大小 2 如果前面的資料大於後面的資料,就交換著兩個資料。經過第一 排序後,便可把最小的資料排好。3 然後再用同樣的方法吧剩下的資料逐個比較,最後得到從小到...