排序算法总结

来源:互联网 发布:网络万能解锁 编辑:程序博客网 时间:2024/06/15 04:15

自己整理的几个排序算法

import java.util.Arrays;

public class Sort {
 public static void main(String[] args) {
  int[] array = {10,20,8,15,23,12,};
  maoPaoSort(array);
  //quickSort(array, 0, array.length-1);
  //insertSort(array);
  //selectSort(array);
  System.out.println(Arrays.toString(array));
 }

 /**
  * 冒泡排序 思想:每次从第一个开始,两两相比,小的数字冒出来,放到前面,大的数字沉下去。一次循环完将最大的数放到了最后
  * @param array
  */
 private static void maoPaoSort(int[] array) {
  int temp = 0;
  for(int i = 0;i<array.length;i++){
   for(int j = 0;j<array.length-1-i;j++){
    if(array[j]>array[j+1]){
     temp = array[j];
     array[j] = array[j+1];
     array[j+1] = temp;
    }
   }
  }
 }
 
 /**
  * 快速排序法  思想:找第一个数为基数赋给一个变量,相当于数组第一个现在是个坑,先从最后一个数找起,直到有比基数小的数,则将这个数放到这个坑中,
  * 然后从前面找起,直到有比这个基数大的数,将这个数又放到前面那个坑里去。一次循环完成后,让其返回现在为一个坑的那个下标,作为下一次循环时的基数下标
  * 挖坑填坑+递归+分治
  * */
 public static void quickSort(int[] array,int low,int high){
  if(low < high){
   int mid = partition(array,low,high);
   quickSort(array,low,mid-1);
   quickSort(array,mid+1,high);
  }
 }
 
 /**
  * 将比基数大的数放到右边,比基数小的数放到左边,
  * @param array
  * @param low
  * @param high
  * @return
  */
 private static int partition(int[] array, int low, int high) {
  int baseKey = array[low];//基数
  if(low < high){
   while (low < high){
    while(low<high && array[high]>baseKey){
     high--;
    }
    if(low < high){
     array[low] = array[high];
     low++;
    }    
    while(low < high && array[low] < baseKey){
     low++;
    }
    if(low < high){
     array [high] = array[low];
     high--;
    }
   }
   array[low] = baseKey;
   //System.out.println(Arrays.toString(array));
  }
  return low;
 }
 
 /**
  * 插入排序  思想:1,将第一个数看成是已经排好序的序列 2,取出下一个元素a,在排好序的列中从后面向前扫描,如果序列中元素大于a,则该元素往后移动,
  * 直到找到一个元素小于等于a,这时将a插入到这个元素的后面。重复这个步骤。
  */
 public static void insertSort(int[] array){
  int insertNum = 0; //要插入的数
  for(int i = 1; i < array.length; i++){
    insertNum = array[i];
    int j;
    for(j = i; j > 0; j--){
     if(array[j-1] > insertNum){
      array[j] = array[j-1];
      continue;
     }
     break;
    }
    array[j] = insertNum; 
  }
 }
 
 /**
  * 选择排序  思想:选择一个数组中最小的数,放在第一位,然后再找余下的数中最小的数,放在第二位,重复这个操作
  */
 public static void selectSort(int[] array){
  int i, j, min, temp;
  for(i = 0; i < array.length; i++){
   min = i;//最小数的下标
   for(j = i+1; j < array.length; j++){
    if(array[j] < array[min])//找出剩余数字中的最小数
     min = j;   
   }
   if(i != min){//将最小数字放到前面来,交换
    temp = array[i];
    array[i] = array[min];
    array[min] = temp;
   } 
  }
 }
}