要實(shí)現(xiàn)排序功能,一般有兩種途徑,這里對(duì)基本類型不適用,基本類型一般有Arrays中的靜態(tài)方法.
專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)競(jìng)秀免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1.對(duì)象本身實(shí)現(xiàn)Comparable接口,那么該類的實(shí)例就是可以排序的.
有關(guān)Comparable:
只要實(shí)現(xiàn)了Comparable接口,就可以調(diào)用Collections的sort方法對(duì)集合中的元素排序.
2.指定一個(gè)Comparator,也就是實(shí)現(xiàn)了Comparator的類的一個(gè)實(shí)例.
但是Java本身只提供了一個(gè)Comparator的實(shí)現(xiàn),就是Collections.reverseOrder().
該方法返回的是一個(gè)已經(jīng)實(shí)現(xiàn)了Comparable接口的反序.
看一下Comparator的全部?jī)?nèi)容:
public interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
定義了兩個(gè)方法,其實(shí)我們一般都只需要實(shí)現(xiàn)compare方法就行了,因?yàn)轭惗际悄J(rèn)從Object繼承
所以會(huì)使用Object的equals方法.
Comparator一般都作為一個(gè)匿名類出現(xiàn),對(duì)于沒有實(shí)現(xiàn)Comparable的對(duì)象的集合,排序的時(shí)候
需要指定一個(gè)Comparator.
這里舉例說明
對(duì)于實(shí)現(xiàn)了Comparable的類我們就用最簡(jiǎn)單的Integer
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list);
對(duì)于沒有實(shí)現(xiàn)Comparable的,我們就用Object,按照hashCode大小來排序.
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
return (o1.hashCode()-o2.hashCode());
})
冒泡排序是比較經(jīng)典的排序算法。代碼如下:
for(int i=1;iarr.length;i++){
for(int j=1;jarr.length-i;j++){
//交換位置
} ? ?
拓展資料:
原理:比較兩個(gè)相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。重復(fù)第一趟步驟,直至全部排序完成。
第一趟比較完成后,最后一個(gè)數(shù)一定是數(shù)組中最大的一個(gè)數(shù),所以第二趟比較的時(shí)候最后一個(gè)數(shù)不參與比較;
第二趟比較完成后,倒數(shù)第二個(gè)數(shù)也一定是數(shù)組中第二大的數(shù),所以第三趟比較的時(shí)候最后兩個(gè)數(shù)不參與比較;
依次類推,每一趟比較次數(shù)-1;
……
舉例說明:要排序數(shù)組:int[]?arr={6,3,8,2,9,1};?
for(int i=1;iarr.length;i++){
for(int j=1;jarr.length-i;j++){
//交換位置
} ? ?
參考資料:冒泡排序原理
輸入三個(gè)數(shù)你可以這樣
Scanner in=new Scanner(System.in);
int a=in.nextInt();
Scanner in=new Scanner(System.in);
int b=in.nextInt();
Scanner in=new Scanner(System.in);
int c=in.nextInt();
然后對(duì)三個(gè)數(shù)進(jìn)行比較。
int tmp=0;
if(ab){
tmp=a;
a=b;
b=tmp;
}
if(ac){
tmp=a;
a=c;
c=tmp;
}
if(bc){
tmp=b;
b=c;
c=tmp;
}
System.out.println(a+" "+b+" "+c);
這就可以了,自己想想動(dòng)動(dòng)腦子才能靈活運(yùn)用,如果只是給你代碼,你只會(huì)復(fù)制粘貼。
java常見的排序分為:
1 插入類排序
主要就是對(duì)于一個(gè)已經(jīng)有序的序列中,插入一個(gè)新的記錄。它包括:直接插入排序,折半插入排序和希爾排序
2 交換類排序
這類排序的核心就是每次比較都要“交換”,在每一趟排序都會(huì)兩兩發(fā)生一系列的“交換”排序,但是每一趟排序都會(huì)讓一個(gè)記錄排序到它的最終位置上。它包括:起泡排序,快速排序
3 選擇類排序
每一趟排序都從一系列數(shù)據(jù)中選擇一個(gè)最大或最小的記錄,將它放置到第一個(gè)或最后一個(gè)為位置交換,只有在選擇后才交換,比起交換類排序,減少了交換記錄的時(shí)間。屬于它的排序:簡(jiǎn)單選擇排序,堆排序
4 歸并類排序
將兩個(gè)或兩個(gè)以上的有序序列合并成一個(gè)新的序列
5 基數(shù)排序
主要基于多個(gè)關(guān)鍵字排序的。
下面針對(duì)上面所述的算法,講解一些常用的java代碼寫的算法
二 插入類排序之直接插入排序
直接插入排序,一般對(duì)于已經(jīng)有序的隊(duì)列排序效果好。
基本思想:每趟將一個(gè)待排序的關(guān)鍵字按照大小插入到已經(jīng)排序好的位置上。
算法思路,從后往前先找到要插入的位置,如果小于則就交換,將元素向后移動(dòng),將要插入數(shù)據(jù)插入該位置即可。時(shí)間復(fù)雜度為O(n2),空間復(fù)雜度為O(1)
package sort.algorithm;
public class DirectInsertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20 };
int temp, j;
for (int i = 1; i data.length; i++) {
temp = data[i];
j = i - 1;
// 每次比較都是對(duì)于已經(jīng)有序的
while (j = 0 data[j] temp) {
data[j + 1] = data[j];
j--;
}
data[j + 1] = temp;
}
// 輸出排序好的數(shù)據(jù)
for (int k = 0; k data.length; k++) {
System.out.print(data[k] + " ");
}
}
}
三 插入類排序之折半插入排序(二分法排序)
條件:在一個(gè)已經(jīng)有序的隊(duì)列中,插入一個(gè)新的元素
折半插入排序記錄的比較次數(shù)與初始序列無關(guān)
思想:折半插入就是首先將隊(duì)列中取最小位置low和最大位置high,然后算出中間位置mid
將中間位置mid與待插入的數(shù)據(jù)data進(jìn)行比較,
如果mid大于data,則就表示插入的數(shù)據(jù)在mid的左邊,high=mid-1;
如果mid小于data,則就表示插入的數(shù)據(jù)在mid的右邊,low=mid+1
最后整體進(jìn)行右移操作。
時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(1)
package sort.algorithm;
//折半插入排序
public class HalfInsertSort {
public static void main(String[] args) {
int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20 };
// 存放臨時(shí)要插入的元素?cái)?shù)據(jù)
int temp;
int low, mid, high;
for (int i = 1; i data.length; i++) {
temp = data[i];
// 在待插入排序的序號(hào)之前進(jìn)行折半插入
low = 0;
high = i - 1;
while (low = high) {
mid = (low + high) / 2;
if (temp data[mid])
high = mid - 1;
else
// low=high的時(shí)候也就是找到了要插入的位置,
// 此時(shí)進(jìn)入循環(huán)中,將low加1,則就是要插入的位置了
low = mid + 1;
}
// 找到了要插入的位置,從該位置一直到插入數(shù)據(jù)的位置之間數(shù)據(jù)向后移動(dòng)
for (int j = i; j = low + 1; j--)
data[j] = data[j - 1];
// low已經(jīng)代表了要插入的位置了
data[low] = temp;
}
for (int k = 0; k data.length; k++) {
System.out.print(data[k] + " ");
}
}
}
四 插入類排序之希爾排序
希爾排序,也叫縮小增量排序,目的就是盡可能的減少交換次數(shù),每一個(gè)組內(nèi)最后都是有序的。
將待續(xù)按照某一種規(guī)則分為幾個(gè)子序列,不斷縮小規(guī)則,最后用一個(gè)直接插入排序合成
空間復(fù)雜度為O(1),時(shí)間復(fù)雜度為O(nlog2n)
算法先將要排序的一組數(shù)按某個(gè)增量d(n/2,n為要排序數(shù)的個(gè)數(shù))分成若干組,每組中記錄的下標(biāo)相差d.對(duì)每組中全部元素進(jìn)行直接插入排序,然后再用一個(gè)較小的增量(d/2)對(duì)它進(jìn)行分組,在每組中再進(jìn)行直接插入排序。當(dāng)增量減到1時(shí),進(jìn)行直接插入排序后,排序完成。
package sort.algorithm;
public class ShellSort {
public static void main(String[] args) {
int a[] = { 1, 54, 6, 3, 78, 34, 12, 45, 56, 100 };
double d1 = a.length;
int temp = 0;
while (true)
{
//利用這個(gè)在將組內(nèi)倍數(shù)減小
//這里依次為5,3,2,1
d1 = Math.ceil(d1 / 2);
//d為增量每個(gè)分組之間索引的增量
int d = (int) d1;
//每個(gè)分組內(nèi)部排序
for (int x = 0; x d; x++)
{
//組內(nèi)利用直接插入排序
for (int i = x + d; i a.length; i += d) {
int j = i - d;
temp = a[i];
for (; j = 0 temp a[j]; j -= d) {
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
if (d == 1)
break;
}
for (int i = 0; i a.length; i++)
System.out.print(a[i]+" ");
}
}
五 交換類排序之冒泡排序
交換類排序核心就是每次比較都要進(jìn)行交換
冒泡排序:是一種交換排序
每一趟比較相鄰的元素,較若大小不同則就會(huì)發(fā)生交換,每一趟排序都能將一個(gè)元素放到它最終的位置!每一趟就進(jìn)行比較。
時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(1)
package sort.algorithm;
//冒泡排序:是一種交換排序
public class BubbleSort {
// 按照遞增順序排序
public static void main(String[] args) {
// TODO Auto-generated method stub
int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20, 13, 100, 37, 16 };
int temp = 0;
// 排序的比較趟數(shù),每一趟都會(huì)將剩余最大數(shù)放在最后面
for (int i = 0; i data.length - 1; i++) {
// 每一趟從開始進(jìn)行比較,將該元素與其余的元素進(jìn)行比較
for (int j = 0; j data.length - 1; j++) {
if (data[j] data[j + 1]) {
temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
for (int i = 0; i data.length; i++)
System.out.print(data[i] + " ");
}
}
網(wǎng)頁題目:java實(shí)現(xiàn)快速排序代碼 java快速排序的代碼
分享網(wǎng)址:http://vcdvsql.cn/article14/ddihpge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站策劃、App設(shè)計(jì)、響應(yīng)式網(wǎng)站、定制開發(fā)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)