1、氣泡排序:
/*氣泡排序(bubble sort,台灣另外一種譯名為:泡沫排序)是一種簡單的排序演算法。
* 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
* 走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
* 這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
* * 氣泡排序對n個專案需要o(n^2)的比較次數,且可以原地排序。
* 儘管這個演算法是最簡單了解和實現的排序演算法之一,但它對於少數元素之外的數列排序是很沒有效率的。
* * 氣泡排序是與插入排序擁有相等的執行時間,但是兩種演算法在需要的交換次數卻很大地不同。
* 在最好的情況,氣泡排序需要o(n^2)次交換,而插入排序只要最多o(n)交換。
* 氣泡排序的實現(類似下面)通常會對已經排序好的數列拙劣地執行(o(n^2)),而插入排序在這個例子只需要o(n)個運算。
* 因此很多現代的演算法教科書避免使用氣泡排序,而用插入排序取代之。
* 氣泡排序如果能在內部迴圈第一次執行時,使用乙個旗標來表示有無需要交換的可能,也可以把最好的複雜度降低到o(n)。
* 在這個情況,已經排序好的數列就無交換的需要。若在每次走訪數列時,把走訪順序反過來,也可以稍微地改進效率。
* 有時候稱為雞尾酒排序,因為演算法會從數列的一端到另一端之間穿梭往返。
* * 氣泡排序演算法的運作如下:
* 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
* 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
* 針對所有的元素重複以上的步驟,除了最後乙個。
* 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。*/
public class bubblesort ;
for(int i=0;inumber[j+1])
}} for(int num:number)
}}
2、插入排序:
/*一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:
* * 從第乙個元素開始,該元素可以認為已經被排序
* 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄
* 如果該元素(已排序)大於新元素,將該元素移到下一位置
* 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
* 將新元素插入到該位置後
* 重複步驟2~5
* 如果比較操作的代價比交換操作大的話,可以採用二分查詢法來減少比較操作的數目。
* 該演算法可以認為是插入排序的乙個變種,稱為二分查詢插入排序。*/
public class insertionsort ;
for(int i=1;i0
while(j>0&&number[j-1]>temp)
number[j]=temp;
}for(int num:number)
}}
3、快速排序:
/*快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
* * 步驟為:
* 從數列中挑出乙個元素,稱為"基準"(pivot),
* 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。
* 在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
* 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
* 遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。
* 雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
*/public class quicksort ;
comparator1 comparator1= new comparator1();
sort(number,comparator1);
for(integer num:number) }
public static final random rnd=new random();
private static void swap(object array,int i,int j)
private staticint partition(earray,int begin,int end,comparator<? super e> cmp)
} public staticvoid sort(e array,comparator<? super e> cmp) }
class comparator1 implements comparator
return 0;
}}
4、選擇排序:
public class selectionsort ;
for(int i=0;i
實現的時候忘記將重新排序的陣列返回,導致排序失敗。
public class mergesort ;
int result=mergesort(number);
for(int num:result)
} private static int mergesort(int arr)
int half=arr.length/2;
system.out.println("half:"+half);
int arr1=new int[half];
int arr2=new int[arr.length-half];
system.arraycopy(arr, 0, arr1, 0, arr1.length);
system.arraycopy(arr, half, arr2, 0, arr2.length);
//system.out.print("arr1:");
for(int arrr1:arr1)
system.out.println();
system.out.print("arr2:");
for(int arrr1:arr2)
system.out.println();
//改變陣列忘了傳回來
arr1=mergesort(arr1);
arr2=mergesort(arr2);
system.out.print("arr1+arr2 ");
for(int arrr1:arr1)
for(int arrr1:arr2)
system.out.println();
int result=mergesortsub(arr1, arr2);
system.out.print("re: ");
for(int re:result)
system.out.println();
return result;
} private static int mergesortsub(int arr1,int arr2);
int b=countsort(a);
for(int i:a)
system.out.println();
for(int i:b)
} public static int countsort(int arr)
if(i=0;--i)
return b;
}}
Java實現基本排序演算法
public class sort public static sort getinstance return sort private void move int array,int from,int end 交換陣列中的兩個元素的位置 param array 待交換的陣列 param i 第乙個...
基本排序演算法java實現
七種基於比較排序演算法記憶口訣 冒擇入希速歸堆 冒失選擇入口的希望是快速回歸馬王堆 氣泡排序 public class bubblesort 從右邊開始,每次迴圈最小值向左沉下去 選擇排序 public class selectionsort tmp arr i arr i arr k arr k ...
基本演算法 堆排序 Java實現
堆排序就是將序列調整為指定的堆,然後調整首尾元素的位置,取出末尾元素,反覆進行,直到將所有元素取出,形成乙個有序的序列。假設存在 個元素的序列 其中父節點值不大於子節點值的堆稱為小根堆 r i r2 i 1且 ri r 2i 2 父節點的值不小於子節點的堆稱為大根堆 r i r2 i 1且 存在乙個...