4.1、排序算法

说明: AElFTkSuQmCC.png

说明: untitle.png

说明: untitle.png

冒泡排序

思想:

1、一个无序的数组,n个元素,一共需要排序n-1轮

2、在每一轮中,从数组第0位开始,比较相邻两个元素,如果与需求逆序,就交换这两个元素,在每一轮中,可以将当前最大(最小)的元素交换到最后,

3、直到执行完n-1轮,没有需要比较的元素为止。

代码实现:

public static void bubSort(int[] a){    
  for (int i = 0;i < a.length - 1;i++){       
    for (int j = 0;j < a.length - 1 - i;j++){           
      if (a[j] > a[j + 1]){                
        int temp = a[j];                
        a[j] = a[j + 1];                
        a[j + 1] = temp;            
      }      
    }  
  }   
}

快速排序

思想:

代码实现:

选择排序

思想:

1、一个无序的数组,一共有n个元素,需要排序n-1轮

2、在每一轮的排序中,需要将当前轮的第0个元素的角标记录下来,然后依次与后面的元素进行比较,如果发现比当前轮第0个元素更小(更大)的元素,就记录角标,当比较完数组最后一个元素,如果最小的元素不是当前轮第0个元素,进行交换。

3、直到执行完n-1轮,所有元素都按顺序排好

说明: untitle.png

代码实现:

public static void seletSort(int[] a){    
  //外层控制比较的轮数    
  for (int i = 0;i < a.length - 1;i++){       
    //声明一个变量,用于存储最小元素的角标,起始位轮数的第一个元素的角标       
    int minNum = i;       
    //内层循环控制每一轮的比较,第0个元素从当前轮第一个元素开始比较        
    for (int j = i + 1;j < a.length;j++){            
      minNum = (a[minNum] < a[j])?minNum : j;       
    }       
    //一轮比完以后,将第0位的元素,如果当前轮最小元素不是第0位,就交换位置       
    if (minNum != i){            
      int temp = a[minNum];           
      a[minNum] = a[i];        
      a[i] = temp;     
    } 
  }
}

插入排序

思想:

1、一个无序的数组,n个元素,一共执行n-1轮

2、在每一轮中,需要将当前有序区边界后一个元素,依次与有序区元素右后向前进行比较,如果是逆序的,就将有序区的该元素向后移一位,直到遇到顺序的有序区元素,就停止比较,进行下一轮,并将该元素插入该有序区元素的后面。

3、直到执行完n-1轮,将所有元素按照顺序排好

说明: untitle.png

代码实现:

public static void insertSort(int[] a){    
  //外层循环控制轮数    
  for (int i = 1;i < a.length;i++){       
    //每一轮中进行比较的元素为a[i]      
    //变量j为有序区最后一个元素的角标   
    int num = a[i];      
    int j = i - 1;       
    /*内层循环控制每一轮比较的细节       q
    要插入的元素一次向前比较,如果小于前面的元素就将比较的元素向后移动    
    直到数组的第0位        
    */      
    while (j >= 0 && num < a[j]){ 
      a[j + 1] = a[j];         
      j--;      
    }      
    //如果到了数组的第0位或插入的元素比要比较的元素大的情况下,就在比较的元素后面插入     
    a[j + 1] = num;  
  }
}

排序算法性能对比

说明: untitle.png