八大排序

1:冒泡排序

  依次比较相邻的两个数,将小数放在前面,大数放在后面。

  即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。

  在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

public class BubbleSort {
    public static void BubbleSort(int[] arr) {
        int temp;//定义一个临时变量
        for(int i=0;i<arr.length-1;i++){//冒泡趟数
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j+1]<arr[j]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
    public static void main(String[] args) {
        int arr[] = new int[]{1,6,2,2,5};
        BubbleSort.BubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 2:插入排序

  基本思想:选择前面两个排序,构成一个有序序列。将一个数插入进去,构成一个有序序列,重复之前的步骤。

  把n个待排序的元素看成一个有序表和无序表。一开始有序表只包含一个元素,无序表中包含n-1个元素。排序过程中每次从无序表中取出第一个元素,把它依次与有序表中的元素进行比较。然后把它插 入到有序表的适当位置,形成新的有序表。

  

package com.test_1;

import java.util.Calendar;

public class Demo5_3 {

    public static void main(String[] args) {

        //构建一个庞大的无序数组用于测试时间
        int len=10;
        int arr1 [] = new int [len];
        for(int i=0;i<len;i++){
            //让程序随机产生一个1~10000的数
            //Math.random()会产生一个0~1的数
            int t = (int)(Math.random()*len);
            arr1[i] = t;
        }

        //插入排序法
        InsertSort iSort = new InsertSort();
        iSort.sort(arr1);
    }

}


class InsertSort
{
        public void sort(int arr[])
        {
            for(int i =1; i<arr.length;i++)
            {
                //插入的数
                int insertVal = arr[i];
                //被插入的位置(准备和前一个数比较)
                int index = i-1;
                        //如果插入的数比被插入的数小
                        while(index>=0&&insertVal<arr[index])
                        {
                            //将把arr[index] 向后移动
                            arr[index+1]=arr[index];
                            //让index向前移动
                            index--;
                        }
                        //把插入的数放入合适位置
                arr[index+1]=insertVal;
            }

            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "   ");
            }

        }
}

 

 

3:选择排序

  基本思想:遍历整个序列选择一个最小的放在最前面,遍历剩下的序列选择一个最小的放在最前面,重复前面的步骤

    

//选择排序
public class SelectionSort {
    public static void main(String[] args) {
        int[] arr={1,3,2,45,65,33,12};
        System.out.println("交换之前:");
        for(int num:arr){
            System.out.print(num+" ");
        }        
        //选择排序的优化
        for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
            int k = i;
            for(int j = k + 1; j < arr.length; j++){// 选最小的记录
                if(arr[j] < arr[k]){ 
                    k = j; //记下目前找到的最小值所在的位置
                }
            }
            //在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
            if(i != k){  //交换a[i]和a[k]
                int temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }    
        }
        System.out.println();
        System.out.println("交换后:");
        for(int num:arr){
            System.out.print(num+" ");
        }
    }

}

 

posted @ 2018-11-28 12:08  ojbk-  阅读(646)  评论(0)    收藏  举报