主要講五個排序,冒泡排序、選擇排序、插入排序
1)冒泡排序
/** * 冒泡排序 (默認升序排) * 相鄰兩個相比較,較大的向后放,從數組或者集合中的第一個與第二個比較到倒數第二個與最后一個比較為一輪比較 * 總共需要比較list.length-1輪循環比較 */ @Test public void bubblesort() { List<Integer> list = Arrays.asList(3, 3, 54, 213, 34, 876, 32, 456, 567, 43, 121, 312, 123, 45, 234, 234, 123, 546, 867, 89, 807, 8, 76); //確定需要重復的次數 for (int j = 0; j < list.size() - 1; j++) { //每次循環都把相鄰想個相比較,較大的向后放 //這里減j 每循環一輪,比較的時候就會少比較一次 for (int m = 0; m < list.size() - j - 1; m++) { int b; if (list.get(m) > list.get(m + 1)) { b = list.get(m); list.set(m, list.get(m + 1)); list.set(m + 1, b); } } } for (Integer integer : list) { System.out.println(integer); } }
2)選擇排序
/** * 選擇排序 (默認升序) * 假設一個最小值,循環比較出實際最小值 * 然后把假設最小值與實際最小值互換位置 */ @Test public void chooseSort() { List<Integer> list = Arrays.asList(3, 3, 54, 213, 34, 876, 32, 456, 567, 43, 121, 312, 123, 45, 234, 234, 123, 546, 867, 89, 807, 8, 76); //總共需要多少輪循環比較,i表示該輪循環假設最小值的角標 for (int i =0; i < list.size()-1; i++){ int temp=i; //假設i是本輪循環中最小元素的索引,temp記錄最小元素的角標 for (int n = i+1; n < list.size();n ++){ //比較本輪循環中目前最小值和這個索引下的元素的比較 if (list.get(temp) > list.get(n)){ //如果最小值大於n索引下的元素值那就把n當成最小值索引 temp = n; } } //到這里temp就是實際最小元素的角標了 if (list.get(i) > list.get(temp)){ //如果所假設的的最小值 大於 實際最小值,則互換位置 int record; record = list.get(i); list.set(i,list.get(temp)); list.set(temp,record); } } for (Integer integer : list) { System.out.println(integer); } }
3)插入排序
/** * 插入排序 * 從每個數組的第二個元素開始向前比較,只要比前面的小就互換位置, * 直到前面一個小於等於這個值的時候跳出本循環,開始插入下一個元素 * */ @Test public void insertSort(){ List<Integer> list = Arrays.asList(3, 3, 54, 213, 34, 876, 32, 456, 567, 43, 121, 312, 123, 45, 234, 234, 123, 546, 867, 89, 807, 8, 76); //確定插入的元素是 list.get(i) for (int i = 1;i<list.size();i++) { int j=i; //向前循環比較,如果前面的比插入的值大就互換位置 while (j>0 && j < list.size()){ if (list.get(j) < list.get(j-1)){ int record=list.get(j); list.set(j,list.get(j-1)); list.set(j-1,record); }else { //else可以省略,但是考慮到如果已經確定了前面不會出現比該元素大的數那么再循環下去等於做的無用功,可以直接結束本次循環來節省時間 break; } j--; } } for (Integer integer : list) { System.out.println(integer); } }