今天復習了五個排序,分別是冒泡排序,選擇排序,插入排序,哈希排序和快速排序;
然后看了thinking in java的第一章和第二章;
下面就是今天學的所有知識
1.冒泡排序:冒泡排序主要是對鄰近的數據進行比較,根據結果判斷是否進行交換,一輪一輪挑出其中比較大(小)的數據放到數組末尾;在一輪一輪比較中,需要比較的數據一次減少一個,直到最后下標為0和1的進行比較后,則代表數組已經有序了。
下面是實現代碼:
在這里面,upper用來決定每一輪進行排序的數據個數,由于下標可以為0且內部有sc[i+1]代碼的存在,所以里層for循環的取值為:0~sc.length-2;
2.選擇排序:這個選擇排序和冒泡排序進行比較的次數相等,不過這里是一次性找出一輪數據中最大(小)的數據,放在數組末尾(開頭),然后下一輪取其他的數據再一次進行選取最大(小)值;
下面是實現代碼:
這里實現的是一個從小到大的排序。首先upper和上面一樣取值:1~sc.length-1,在表循環中,將sc[0]設置為最大值,然后數據判斷從下標1開始,若有sc[n]<sc[0]則把最大值的下標由0換成n,最后判斷一下最后的數據是否是下標代表的最大值,不是則把下標代表的最大值和最后面的值做一個交換,這樣就完成了一次排序;
這里的子循環中的i可以為1,這代表sc[0]和sc[1]進行比較;
3.插入排序:插入排序是把一個數組分成了三個部分:有序部分,待插入值,無序部分;有序部分的個數由1~sc.length-1;當最后一個數據也進入了有序隊列,則排序完成;插入排比價序主要是將待插入值放入有序隊列中去,通過比較,將它插入到隊列中形成一個有序的新隊列;
下面是插入排序的代碼:
其中count代表待插入值的下標,1~sc.length-1;然后子循環中用num來存儲待插入值,讓每一個值和他比較,若待插入值小于比較的值,則把比較的值直接后移一位;i=1時代表前面所有數據都大于待插入值,所以就把該值放在0下標處;
4.哈希排序:哈希排序是一個改良版的插入排序,它主要是通過選取一定的間隔,在早期就把離正確位置很遠的數據直接一次性轉移過去,而不需要插入排序一樣一次一次比較復制慢慢地轉移過去。在大量數據中,他的速度要比插入排序好很多,而且它在數據逆行的情況下,速度比插入排序快了很多;下面是哈希排序的代碼,這個我自己也不是很明白;
這里的num就是選取的固定間隔,num遵循一種算式,讓每一個num互成質數,這樣的效率是最高的;第一次排序,對下標為:num~sc.length-1的數據進行了間隔為num的數組的排序,注意這里子循環判斷條件已經發生改變了;然后按公式慢慢減小num,最后直到為1時,代表數據已經排序完成;
哈希排序和插入排序最大的不同之處在于 ?sc[i] = sc[i-1] ?和 ?sc[i] = sc[i-num];
5.快速排序:快速排序主要是應用了一個遞歸和劃分的概念。劃分指的是取一個值,將數組中的數據分成兩部分,左邊的全部小于該數據,右邊的全部大于等于該數據;然后又把左邊和右邊兩個數組用這個方法,分到最后,所有數據已經做到了有序狀態了;這個排序要分成兩個部分,一個是遞歸的部分,另一個是劃分的部分;
這個函數采用的是直接把數組最右邊的數據作為他的中間值(樞紐),然后在劃分后,把樞紐放在兩個部分中間,此時該數據已經存在了正確排序的位置了,然后對兩邊兩組新數組進行排序……
在劃分階段,我們設置了一個左指針和右指針,分別判斷兩頭的數據和樞紐的關系,若左側存在大于樞紐的值并且右側存在小于樞紐的值,則將兩個值進行交換,然后繼續判斷,直到兩個指針相等或擦肩而過,則代表該已經劃分成功,這時候把最右端數據和右數組的第一個數據進行交換,則完成了劃分的功能了。返回的是中間樞紐的下標值;