Java各種排序演算法

2021-08-30 10:42:20 字數 4407 閱讀 5935

/**

* 排序測試類

* * 排序演算法的分類如下:

* 1.插入排序(直接插入排序、折半插入排序、希爾排序);

* 2.交換排序(冒泡泡排序、快速排序);

* 3.選擇排序(直接選擇排序、堆排序);

* 4.歸併排序;

* 5.基數排序。

* * 關於排序方法的選擇:

* (1)若n較小(如n≤50),可採用直接插入或直接選擇排序。

*  當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。

* (2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;

* (3)若n較大,則應採用時間複雜度為o(nlgn)的排序方法:快速排序、堆排序或歸併排序。

* */

public class sorttest

system.out.println("**********原始序列**********");

printarray(array);

return array;

}/**

* 列印陣列中的元素到控制台

* @param source

*/public void printarray(int data)

system.out.println();

}/**

* 交換陣列中指定的兩元素的位置

* @param data

* @param x

* @param y

*/private void swap(int data, int x, int y)

/*** 氣泡排序----交換排序的一種

* 方法:相鄰兩元素進行比較,如有需要則進行交換,每完成一次迴圈就將最大元素排在最後(如從小到大排序),下一次迴圈是將其他的數進行類似操作。

* 效能:比較次數o(n^2),n^2/2;交換次數o(n^2),n^2/4

* * @param data 要排序的陣列

* @param sorttype 排序型別

* @return

*/public void bubblesort(int data, string sorttype) }}

} else if (sorttype.equals("desc")) }}

} else

printarray(data);//輸出氣泡排序後的陣列值

}/**

* 直接選擇排序法----選擇排序的一種

* 方法:每一趟從待排序的資料元素中選出最小(或最大)的乙個元素, 順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

* 效能:比較次數o(n^2),n^2/2

*       交換次數o(n),n

*       交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cup時間多,所以選擇排序比氣泡排序快。

*       但是n比較大時,比較所需的cpu時間佔主要地位,所以這時的效能和氣泡排序差不太多,但毫無疑問肯定要快些。

* * @param data 要排序的陣列

* @param sorttype 排序型別

* @return

*/public void selectsort(int data, string sorttype)

}//交換在位置data.length-i和index(最大值)兩個數

swap(data, data.length - i, index);

}} else if (sorttype.equals("desc"))

}//交換在位置data.length-i和index(最大值)兩個數

swap(data, data.length - i, index);

}} else

printarray(data);//輸出直接選擇排序後的陣列值

}/**

* 插入排序

* 方法:將乙個記錄插入到已排好序的有序表(有可能是空表)中,從而得到乙個新的記錄數增1的有序表。

* 效能:比較次數o(n^2),n^2/4

*       複製次數o(n),n^2/4

*       比較次數是前兩者的一般,而複製所需的cpu時間較交換少,所以效能上比氣泡排序提高一倍多,而比選擇排序也要快。

** @param data 要排序的陣列

* @param sorttype 排序型別

*/public void insertsort(int data, string sorttype) }}

} else if (sorttype.equals("desc")) }}

} else

printarray(data);//輸出插入排序後的陣列值

}/**

* 反轉陣列的方法

* @param data 源陣列

*/public void reverse(int data)

printarray(data);//輸出到轉後陣列的值

}/**

* 快速排序

* 快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

* 步驟為:

* 1. 從數列中挑出乙個元素,稱為 "基準"(pivot),

* 2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割之後,該基準是它的最後位置。這個稱為分割(partition)操作。

* 3. 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

* 遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

* @param data 待排序的陣列

* @param low

* @param high

* @see sorttest#qsort(int, int, int)

* @see sorttest#qsort_desc(int, int, int)

*/public void quicksort(int data, string sorttype) else if (sorttype.equals("desc")) else

}/**

* 快速排序的具體實現,排正序

* @param data

* @param low

* @param high

*/private void qsort_asc(int data, int low, int high)

if (i < j)

while (i < j && data < x)

if (i < j)

}data = x;

qsort_asc(data, low, i - 1);

qsort_asc(data, i + 1, high);}}

/*** 快速排序的具體實現,排倒序

* @param data

* @param low

* @param high

*/private void qsort_desc(int data, int low, int high)

if (i < j)

while (i < j && data > x)

if (i < j)

}data = x;

qsort_desc(data, low, i - 1);

qsort_desc(data, i + 1, high);}}

/***二分查詢特定整數在整型陣列中的位置(遞迴)

*查詢線性表必須是有序列表

*@paramdataset

*@paramdata

*@parambeginindex

*@paramendindex

*@returnindex

*/public int binarysearch(int dataset, int data, int beginindex,

int endindex) else if (data > dataset[midindex]) else

}/**

*二分查詢特定整數在整型陣列中的位置(非遞迴)

*查詢線性表必須是有序列表

*@paramdataset

*@paramdata

*@returnindex

*/public int binarysearch(int dataset, int data) else if (data > dataset[midindex]) else

}return -1;

}public static void main(string args)

}

各種排序演算法java實現

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...

各種排序演算法java實現

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...

各種排序演算法java實現

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...