冒泡排序
基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。
即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
第一次比較排序的結果:會把其中最大的數據排到最大的索引處
第二次比較排序後的結果:因爲第一次已經把最大的一個數據放到了最大的索引的地方,所以這次要進行比較的數據比數組裏面的元素的數據個數-1個,而第二大的數據也會排到第二大的索引處
第三次比較排序的結果:跟第二次差不多,只是這次要進行比較的數據比數組裏面的元素的數據個數還少了2個,
第四次:少3個...
綜上所述,要使數組裏面的數據按照從小到大排序,總的比較的次數會比數組的長度-1次,而隨着比較的次數的增加,每次要進行比較的數據依次減少。
- public class Demo4 {
- public static void main(String[] args) {
- int number[]={49,38,65,97,76,13,27,14,10};
- for(int i=0;i<number.length-1;i++){
- for(int j=0;j<number.length-1-i;j++){
- if(number[j]>number[j+1]){
- int tmp=number[j];
- number[j]=number[j+1];
- number[j+1]=tmp;
- }
- }
- for (int j = 0; j < number.length; j++) {
- System.out.print(number[j]+"\t");
- }
- System.out.println("排序"+(i+1)+"次後的結果");
- }
- }
- }
選擇排序
基本方法:
從0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處,第二次找到第二小的值。
具體是如何實現呢?
首先第一輪是0索引上的數據依次跟後面各個索引上的數據進行比較,直到遇到一個比它小的數據,這時候,這個小的數據就替換掉0索引上原來的數據,接着這個替換掉的數據繼續跟它原來的索引位置的後面的索引上的數據進行比較也就是說,進行完第一輪後,0索引上的數據肯定是這個數組上最小的數據
第二輪接着就是1索引上的數據來跟後面的數據進行比較,這個時候參與比較的數據比原來少了一個
第三輪又會少一個,這樣循環一輪j的值就會+1,也就是j開始的索引下標+1。
- public class Demo5 {
- public static void main(String[] args) {
- int number[]={49,38,65,97,76,13,27,14,10};
- for(int i=0;i<number.length;i++){
- for(int j=i+1;j<number.length;j++){
- if(number[i]>number[j]){
- int tmp=number[i];
- number[i]=number[j];
- number[j]=tmp;
- }
- }
- for (int j = 0; j < number.length; j++) {
- System.out.print(number[j]+"\t");
- }
- System.out.println("第"+(i+1)+"次排序後的結果");
- }
- }
- }
插入排序就是把當前待排序的元素插入到一個已經排好序的列表裏面。 一個非常形象的例子就是右手抓取一張撲克牌,並把它插入左手拿着的排好序的撲克裏面。
插入排序的最壞運行時間是O(n2), 所以並不是最優的排序算法。
如果輸入數組已經是排好序的話,插入排序出現最佳情況,其運行時間是輸入規模的一個線性函數。
如果輸入數組是逆序排列的,將出現最壞情況。平均情況與最壞情況一樣,其時間代價是Θ(n2)。
- public class Demo6 {
- public static void main(String[] args) {
- //定義一個整型數組
- int[] nums = new int[]{4,3,-1,9,2,1,8,0,6};
- //打印沒有進行排序的數組
- System.out.println("沒有排序之前的結果:" + Arrays.toString(nums));
- for(int index=0; index<nums.length; index++) {
- //獲得需要插入的數值
- int key = nums[index];
- //取得下標值
- int position = index;
- //循環比較之前排序好的數據,找到合適的地方插入
- while(position >0 && nums[position-1] > key) {
- nums[position] = nums[position-1];
- position--;
- }
- nums[position] = key;
- }
- //打印排序後的結果
- System.out.println("排序後的結果:" + Arrays.toString(nums));
- }
- }