簡單排序演算法

2021-07-09 19:42:21 字數 3876 閱讀 5929

package com.shine.sort;

/*** 排序演算法  

* @說明:

*     排序演算法分為三種:插入排序、交換排序、選擇排序  

*     1.插入排序:直接插入排序、折半插入排序、希爾排序  

*     2.交換排序:氣泡排序、快速排序    

*     3.選擇排序: 直接選擇排序、堆排序  

*/public class mysort

}/**

* 希爾排序

* @描述:

*      1.將乙個資料序列分成若干組,每組由若干相隔一段距離的元素組成,這段距離稱為增量,

*        在一組內採用直接插入排序演算法進行排序      

*      2.當增量為1時,只有一組,元素是整個序列,再進行一次直接插入排序即可    

* @複雜度分析:

*      1.時間複雜度:時間複雜度比較複雜,具體時間取決於具體增量的序列  

*      2.空間複雜度:o(1)

* @穩定性:不穩定 

*/public static void shellsort(int table)

}/**

* 氣泡排序

* @說明:

*    比較兩個相鄰元素的關鍵值,如果反序,則交換。若按公升序排序,每一趟將被掃瞄的資料序列中的最大元素交換到

*    最後位置,就像氣泡從水裡冒出一樣。  

* @複雜度分析:

*    1.時間複雜度分析:o(n)-o(n*n)

*    2.空間複雜度分析:o(1)

* @穩定性:穩定  

*/public static void bublesort(int table)}}

/*** 快速排序演算法  

* @說明:

* 在資料序列中選擇乙個值作為比較的基準值,每趟從資料序列的兩端開始交替進行,將小於基準值的元素交換到序列

*      前段,大於基準值的元素交換到序列後端,介於兩者之間的位置則稱為基準值的最終位置。同時序列被劃分成兩個子

*      序列,在用同樣的方法對兩個子串行進行排序,直到子串行長度為1,則完成排序。

* @複雜度分析:  

*      時間複雜度:

*          最好情況:每趟排序將序列分成長度相近的兩個子串行。   o(nlog2n)    

*          最壞情況:每趟排序將序列分成長度差異很大的兩個子串行   o(n*n)      

*      空間複雜度:

*      

最好情況:  o(log2n)

*          最壞情況:  o(n)

* @穩定性:不穩定

*/public static void quicksort(int table)

private static void quicksort(int table,int begin,int end)

table[i]=vot;//基準值到達最終位置

quicksort(table,begin,j-1);//前段子序列進行排序

quicksort(table,i+1,end);//後端子序列進行排序

}}/*** 直接選擇排序  

* @說明:

* 第一趟從n個元素的資料中選出關鍵字最小或最大的元素放到最前或最後位置,下一趟再從n-1個元素……。直接選擇排序

*       演算法可用順序表和單鏈表實現。  

* @複雜度:  

*       時間複雜度:o(n*n)

*       空間複雜度:o(1)

* @穩定性:不穩定

*/public static void selectsort(int table)

}}/*** 堆排序

* @說明:

* 1.堆:這裡的堆不是資料結構裡面的堆疊,而是一種資料結構。堆可以視為一顆完全二叉樹,完全二叉樹的乙個優秀的性質是

*         除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個節點對應陣列中的乙個元素。二叉堆一般分

*         為兩種,最小堆和最大堆。

*   2.最大堆:堆中每個父節點的值都大於等於其孩子節點,這樣的堆就是乙個最大堆。

*     最小堆:對中的每個父節點都小於等於其孩子節點,這樣的堆就是乙個最小堆。

*   3.堆排序:堆排序分兩個階段。首先將乙個資料序列建成堆序列,根節點值是最小(大)值;然後採用選擇排序思路,每趟將

*     根結點值交換到最後,再將其餘值調整成堆,依次重複,直到排序完成。

* @複雜度:

* 時間複雜度:o(n*log2n)

*   空間複雜度:o(1)

* @穩定性:不穩定

*/public static void heapsort(int table)

}//將以begin為根的子樹調整成最小堆,begin、end是序列下屆和上屆

private static void sift(int table,int begin,int end)

else break;

}  table[i]=temp;//當前子樹的原根值調整後的位置

}/**

* 歸併排序

* @param args

*///一次歸併方法:   m和r分別是兩個相鄰的兩個已排序的子串行的起始下標

private static void merge(int x,int y,int m,int r,int n)

}//一趟歸併

private static void mergepass(int x,int y,int n)

if(i+n  merge(x,y,i,i+n,n);

//再一次歸併

else

for(int j=i;j//將x剩餘元素複製到y中

y[j]=x[j];

}public static void mergesort(int x)

}}public static void main(string args) ;

system.out.println("直接插入排序:");

insertsort(table);

for(int x: table)

system.out.print(x+"\t");

system.out.println("\n希爾排序:");

shellsort(table);

for(int x: table)

system.out.print(x+"\t");

system.out.println("\n氣泡排序:");

bublesort(table);

for(int x: table)

system.out.print(x+"\t");

system.out.println("\n快速排序:");

quicksort(table);

for(int x: table)

system.out.print(x+"\t");

system.out.println("\n直接選擇排序:");

selectsort(table);

for(int x: table)

system.out.print(x+"\t");

system.out.println("\n堆排序:");

heapsort(table);

for(int x: table)

system.out.print(x+"\t");

system.out.println("\n歸併排序:");

mergesort(table);

for(int x: table)

system.out.print(x+"\t");}}

簡單排序演算法

演算法思想 將初始序列 a 0 a n 1 作為待排序序列,第一趟在待排序序列 a 0 a n 1 中找最小值元素,與該序列中第乙個元素a 0 交換,這樣的子串行 a 0 有序,下一趟排序在待排序子串行 a 1 a n 1 中進行。第i趟排序在待排序子串行 a i 1 a n 1 中,找最小值元素,...

簡單排序演算法

第乙個 氣泡排序 簡單來說,就是不停的與旁邊的比較,然後交換,總之運算的交換次數挺多的,後面再來比較幾種排序方法 void bubblesorthead int pdata,int count 這是一種實現形式,還有另一種 void bubblesorttail int pdata,int coun...

簡單排序演算法

由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所周知的最慢的演算法了...