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.冒泡法 這是最原始,也是眾所周知的最慢的演算法了...