java12-6 冒泡排序法和選擇排序法


1、冒泡排序法
    相鄰元素兩兩比較,大的往后放,第一次完畢,最大值出現在了最大索引處

  分析:
    第一次比較排序的結果:會把其中最大的數據排到最大的索引處
    第二次比較排序后的結果:因為第一次已經把最大的一個數據放到了最大的索引的地方,
    所以這次要進行比較的數據比數組里面的元素的數據個數-1個,而第二大的數據也會排到第二大的索引處
    第三次比較排序的結果:跟第二次差不多,只是這次要進行比較的數據比數組里面的元素的數據個數還少了2個,
    第四次:少3個..
  綜上所述,要使數組里面的數據按照從小到大排序,總的比較的次數會比數組的長度-1次,
       而隨着比較的次數的增加,每次要進行比較的數據依次減少,也就是
          for(int x =0; x < arr.length - 1 ;x++)這個是總的比較的次數
              {
            for(int y =0; y < arr.length - 1 - x; x++){ 這個就是隨着次數的增加,每次要進行比較的數據的個數
                }
              }
  為了方便對多個數組進行冒泡排序,所以把它寫成一個方法:
                    兩要素:
                      a:返回類型:void
                      b:參數列表:int[] arr

 1 public class ArrayTest1 {
 2 
 3 public static void main(String[] args) {
 4 
 5 //建立一個數組
 6 int[] arr = {23,11,45,78,1,42};
 7 
 8 
 9 System.out.println("數組排序前:");
10 getArray(arr); 
11 //調用排序方法
12 bubbleSort(arr);
13 System.out.println("\n數組排序后:");
14 getArray(arr);
15 
16 }
17 
18 //定義冒泡排序的方法
19 public static void bubbleSort(int[] arr){
20 //確定要進行比較的次數
21 // arr.length - 1是為了防止數據越界
22 // arr.length - 1 - x是為了減少比較的次數
23 for(int x = 0;x < arr.length - 1; x++){
24 //定義每次要比較的數據隨着比較的次數的減少而減少
25 for(int y = 0;y < arr.length - 1 - x ; y++){
26 //每次比較后,要對每個數組里的元素進行比較,並排序
27 if(arr[y] > arr[y+1]){
28 //進行排序
29 int temp = arr[y];
30 arr[y] = arr[y + 1];
31 arr[y + 1] = temp;
32 }
33 }
34 }
35 }
36 //排序完畢后,對數組進行遍歷
37 public static void getArray(int[] arr){
38 System.out.print("[");
39 for(int z = 0;z < arr.length; z++){
40 if(z == arr.length - 1){
41 System.out.print(arr[z]+"]");
42 }
43 else{
44 System.out.print(arr[z]+",");
45 }
46 }
47 }
48 }

 


2、 數組排序之選擇排序:
    從0索引開始,依次和后面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處
  分析:
    A:首先是0索引上的數據依次跟后面各個索引上的數據進行比較,
       直到遇到一個比它小的數據,這時候,這個小的數據就替換掉0索引上原來的數據,
       接着這個替換掉的數據繼續跟它原來的索引位置的后面的索引上的數據進行比較
          例如:{22,11,13,10} 22跟11比后,變成{11,22,13,10},接着11繼續跟13、10比較,遇到10后,變成{10,22,13,11}
      也就是說,進行完A后,0索引上的數據肯定是這個數組上最小的數據
    B:接着就是1索引上的數據來跟后面的數據進行比較,這個時候參與比較的數據比原來少了一個
    C:跟B一樣,就這樣進行下去,知道全部都比較完畢。
    D:總結上面,得出總共需要進行幾次A步驟的次數:
        如果是5個數據的數組的話,就一共需要比較arr.length(4)次,若從0開始計數,則是 4-1 = 3次
        而每次比較時,所參與的索引的數據是不一樣的:
        第一次時,是0和1以及后面的數據比較;
        第二次時,是1和2以及后面的數據比較
        ...
    E:從D得出
        for(int x = 0; x< arr.length - 1; x++){
          for(int y = x+1; y < arr.length ;y++){
            }
          }
    F:用E的方法得出排序后的數組后,再進行數組遍歷輸出。
    G:排序和遍歷都用方法來表示,以方便以后的使用
          a:返回類型:無,void
          b:參數列表:int[] arr

 1 public class ArrayTest2 {
 2 
 3 public static void main(String[] args) {
 4 //首先定義一個數組
 5 int[] arr = {23,12,14,11,30,54};
 6 //調用遍歷方法,輸出排序前的數組
 7 System.out.println("進行排序前的數組:");
 8 printArray(arr);
 9 //調用排序和遍歷方法,輸出排序完成后的數組
10 System.out.println("\n排序完成后的數組:");
11 choose(arr);
12 printArray(arr);
13 
14 }
15 //定義排序方法
16 public static void choose(int[] arr){
17 //定義進行A步驟的次數
18 for(int x = 0; x < arr.length - 1; x ++ ){
19 //定義每次參與比較的數據個數
20 for(int y = x + 1;y < arr.length ; y++){
21 //進行數據的比較
22 if( arr[x] > arr[y]){
23 //對數據進行排序
24 int temp = arr[y];
25 arr[y] = arr[x];
26 arr[x] = temp;
27 }
28 }
29 }
30 }
31 
32 
33 //定義遍歷方法
34 public static void printArray(int[] arr){
35 System.out.print("[");
36 for(int x= 0; x< arr.length ;x++){
37 if(x == arr.length-1){
38 System.out.print(arr[x]+"]");
39 }
40 else{
41 System.out.print(arr[x]+",");
42 }
43 }
44 }
45 
46 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM