冒泡排序:
比較相鄰的元素。 如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。 在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。快速排序:所有小于”基準(zhǔn)”的元素,都移到”基準(zhǔn)”的左邊;所有大于”基準(zhǔn)”的元素,都移到”基準(zhǔn)”的右邊。 這個(gè)操作稱為分區(qū)(partition) 操作,分區(qū)操作結(jié)束后,基準(zhǔn)元素所處的位置就是最終排序后它的位置
插入排序:
通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。
代碼:
package Test2/** * Created by zhouzhongqing on 2017/2/7 0007. */object ArithmeticTest { def main(args: Array[String]): Unit = { //bubblingSort(0); // insertSort(0); //val array = Array(2,4,3,5,8,66,7,22,12,11); val array = Array(3,2); quickSort(array, 0, array.length - 1);// 快速排序 for ( i <- 0 to (array.length - 1) ) { PRintln(array(i),"----",array.length); } }/** * 快速排序 * 是對(duì)冒泡排序的一種改進(jìn)。由C. A. R. Hoare在1962年提出。它的基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分, * 其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。 *param data * 目標(biāo)數(shù)組 *param start * 起始位 * param end * 結(jié)束位 * */ def quickSort( data: Array[Int] , start : Int , end : Int ) : Int = { // 設(shè)置關(guān)鍵數(shù)據(jù)key為要排序數(shù)組的第一個(gè)元素, // 即第一趟排序后,key右邊的數(shù)全部比key大,key左邊的數(shù)全部比key小 val key = data(start); // 設(shè)置數(shù)組左邊的索引,往右移動(dòng)比key大的數(shù) var i = start; // 設(shè)置數(shù)組右邊的索引,往左移動(dòng)比key小的數(shù) var j = end; // 如果左邊索引比右邊索引小,則還有數(shù)據(jù)沒有排序 while (i < j){ while(data(j) > key && j > i){ // 2 3 1 0 j = j - 1; } data(i) = data(j);//data(0) = 2 while (data(i) < key && i < j ){// 2 3 0 1 i = i+1;// i = 1 } data(j) = data(i);// data(0) = 2 } //此時(shí) i == j data(i) = key; // data(1) = 3 //遞歸調(diào)用 if(i - 1 > start){ // 遞歸調(diào)用,把key前面的完成排序 quickSort(data, start, i - 1); } if(i + 1 < end){ // 遞歸調(diào)用,把key后面的完成排序 quickSort(data, i + 1, end); } return 0; }/** * 插入排序,從小到大排序 * 這個(gè)算法從數(shù)組的第二個(gè)元素開始循環(huán),將選中的元素與之前的元素一一比較,如果選中的元素小于之前的元素,則將之前的元素后移,最后再將選中的元素放在合適的位置。在這個(gè)算法執(zhí)行的過(guò)程中,總是保持著索引i之前的數(shù)組是升序排列的。 * */ def insertSort( a:Int ) : Int = { val array = Array(2,4,3,5,8,66,7,22,12,11); for ( i <-1 to (array.length -1 ) ) {//這個(gè)算法從數(shù)組的第二個(gè)元素開始循環(huán) j <- 1 var arrayVal = array(i); var j = i - 1;//得到前一位元素 // while 循環(huán)執(zhí)行 2 while( j >= 0 && array(j) > arrayVal){//判斷前面的是否大于arrayVal array(j+1) = array(j);//如果大于,將它放后面 j = j-1; // println(array(j),"----",array.length,"j:" , j); } array(j+1) = arrayVal;//如果一次都不滿足while的條件,arrayVal還在原來(lái)的位置;如果滿足過(guò)arrayVal會(huì)放在前面 } for ( i <- 0 to (array.length - 1) ) { println(array(i),"----",array.length); } return 0; } /** * 冒泡排序 *從大到小排列 * 自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。 */ def bubblingSort( a:Int ) : Int = { val array = Array(2,4,3,5,8,66,7,22,12,11); for ( j <-0 to (array.length - 3) ) { for (i <- 0 to (array.length - 2 - j)) { // println(array(i),"----",array.length); if (array(i) > array(i + 1)) {//判斷前一個(gè)元素是否大于后一個(gè) var temp = 0; temp = array(i + 1);//賦值 array(i + 1) = array(i);//如果前一個(gè)元素大,把他移動(dòng)到后面 array(i) = temp;//把后面一個(gè)移動(dòng)到前面 } } } for ( i <- 0 to (array.length - 1) ) { println(array(i),"----",array.length); } return 0; }}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注