基本排序演算法Java實現

2021-06-29 02:28:08 字數 3784 閱讀 1321

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且 存在乙個...