(將陣列公升序排列)
思路:將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。
要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。
2. **:
/**
* 直接插入排序
* */
public static void insertsort(int unsort)else
unsort[j+1] = flag;}}
}
評價:
時間複雜度:o(n^2)
空間複雜度:o(1)
穩定性:穩定
思想:先將整個待排元素序列分割成若干個子串行(相隔某個增量的元素組成)分別進行直接插入排序,然後依次縮減增量在進行排序,待整個序列元素基本有序(增量為1時),再對全體元素進行一次直接插入排序
**:
/**
* 希爾排序
*/public static void shellsort01(int array)
int gap = array.length/3;
while (gap>0)
}gap /=2;}}
3.評價:
時間複雜度:o(n2),但比一般的空間複雜度為o(n2)的排序效率要高
空間複雜度:o(1)
穩定性:不穩定
思路:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
/**
* 氣泡排序
*/public static void buddlesort(int unsort)}}
}//交換陣列的元素
public static void swap(int unsort,int i, int j )
//氣泡排序的改進
/**傳統氣泡排序中每一趟排序操作只能找到乙個最大值或最小值,我們考慮利用
*在每趟排序中進行正向和反向兩遍冒泡的方法一次可以得到兩個最終值
*(最大者和最小者) , 從而使排序趟數幾乎減少了一半。
*/int low = 0;
int high = unsort.length-1;
int j;
while (lowunsort[j+1])
}--high;
for (j = high; j >low ; j--)
int base = unsort[start];
int i = start;
int j = end;
while (i!=j) else if (unsort[j] < unsort[min])
}system.out.println(unsort[min] + "\t"+unsort[max]);
//將本次輪迴的最小值和陣列指定位置元素交換
tmp = unsort[min];
unsort[min] = unsort[i];
unsort[i] = tmp;
//將本次輪迴的最大值和陣列指定位置元素交換
tmp = unsort[max];
unsort[max] = unsort[len -i-1];
unsort[len - i-1] = tmp;}}
3.評價:
時間複雜度:o(n^2)
空間複雜度:o(1)
穩定性:穩定
/**
* 堆排序
*/public static void heapsort(int unsort)
}/**
* 對陣列unsort陣列進行從0到i建立大頂堆
*/private static void buildheapsort(int unsort, int i)
public static void mergesort(int unsort,int start,int end,int temp)
}int time = 0;
//判斷位數
while (max>0)
//建立10個佇列
list> queue = new arraylist>();
for (int i = 0; i < 10; i++)
//進行time次的分配和收集
for (int i = 0; i < time; i++)
int count =0;//元素計數器
//收集佇列元素
每種排序演算法都各有優缺點。因此,在實用時需根據不同情況適當選用,甚至可以將多種方法結合起來使用。
選擇排序演算法的依據
影響排序的因素有很多,平均時間複雜度低的演算法並不一定就是最優的。相反,有時平均時間複雜度高的演算法可能更適合某些特殊情況。同時,選擇演算法時還得考慮它的可讀性,以利於軟體的維護。一般而言,需要考慮的因素有以下四點:
1.待排序的記錄數目n的大小;
2.記錄本身資料量的大小,也就是記錄中除關鍵字外的其他資訊量的大小;
3.關鍵字的結構及其分布情況;
4.對排序穩定性的要求。
設待排序元素的個數為n.
1)當n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。
2) 當n較大,記憶體空間允許,且要求穩定性 =》歸併排序
3)當n較小,可採用直接插入或直接選擇排序。
5)一般不使用或不直接使用傳統的氣泡排序。
6)基數排序
它是一種穩定的排序演算法,但有一定的侷限性:
1、關鍵字可分解。
2、記錄的關鍵字位數較少,如果密集更好
3、如果是數字時,最好是無符號的,否則將增加相應的對映複雜度,可先將其正負分開排序。
八種排序演算法 Java實現
基本思想 在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。實現 public class selectsort selectsort a for int i 0 i public static v...
八種常見排序演算法java實現
目錄 1.直接插入排序 2.希爾排序 3.簡單選擇排序 4.堆排序 5.氣泡排序 6.快速排序 7.歸併排序 8.基數排序 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直...
八種基本排序演算法
1 思路 對尚未排序的各元素從頭到尾依次比較相鄰的兩個元素是否逆序 與欲排順序相反 若逆序就交換這兩元素,經過第一輪比較排序後便可把最大 或最小 的元素排好 然後再用同樣的方法把剩下的元素逐個進行比較,就得到了你所要的順序 可以看出如果有 n 個元素,那麼一共要進行 n 1 輪比較,第 i 輪要進行...