简单排序算法

简单排序算法

常见排序列表

背的技巧


选择排序

最简单但是也是最没用的一种算法。(时间复杂度N方,还不稳定)。

时间复杂度:N方

空间复杂度:1

基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值,与 arr[0]交换;第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换;第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。

代码实现

public class 选择排序 {
    public static void main(String[] args) {
    int arr[] = {1,3,2,4,5};
     //返回数组的字符串形式
     System.out.println("排序前:"+Arrays.toString(arr));
     Arrays.toString(arr)
     System.out.println("排序后:"+Arrays.toString(arr)); 
        }
    
    //选择排序算法 
    public static void SelectSort(int [] arr){
         for(int i = 0;i < arr.length-1;i++){
            int minPos = i;
            for(int j = i+1;j < arr.length;j++){
                if(arr[minPos] > arr[j]){
                    minPos = j;
                }
                //交换两个数
                swap(arr,minPos,i);
            }    
            System.out.println(Arrays.toString(arr));
        }
        
        //交换两个数
         public static void swap(int [] arr){
              	int temp=arr[i];
        		arr[i]=arr[j];
        		arr[j]=temp;
         }
        
    }

算法验证—对数器

class DataChecker{

    public static int []  Random(){
        Random r = new  Random();
        int [] arr = new int[10000];
        for(int i=0;i<arr.length;i++){
            arr[i]=r.nextInt(10000);
        }
        return arr;
    }

    public static void Check(){
        int arr [] = Random();
        int arr2 [] = new int [arr.length];
        System.arraycopy(arr,0,arr2,0,arr.length);

        Arrays.sort(arr);
        SelectSort(arr2);

        boolean flag=true;
        for(int i =0;i<arr.length;i++){
            if(arr[i]!=arr2[i]){
                flag=false;
                break;
            }
        }
        if(flag){
            System.out.println("正确");
        }
        else{
            System.out.println("错误");
        }
    }
        //选择排序算法 
    public static void SelectSort(int [] arr){
         for(int i = 0;i < arr.length-1;i++){
            int minPos = i;
            for(int j = i+1;j < arr.length;j++){
                if(arr[minPos] > arr[j]){
                    minPos = j;
                }
                //交换两个数
                swap(arr,minPos,i);
            }    
            System.out.println(Arrays.toString(arr));
        }
        
        //交换两个数
         public static void swap(int [] arr){
              	int temp=arr[i];
        		arr[i]=arr[j];
        		arr[j]=temp;
         }
        
    }
    
}

学习知识点:

选择排序

对数器

在第二个循环中,不能直接交换两个数,会改变数组中的元素,定义一个mindex代替循环变量j。

    if(arr[minPos]>arr[j]){//前面的并不是最小值,交换两个值
                    minPos=j;
                }
				//交换两个数
                swap(arr,minPos,i);

冒泡排序

冒泡排序:从前向后遍历,依次比较相邻元素的值,若发现相邻元素则交换,这样遍历完一次可以让最大元素放在最后。

优化:在排序的过程中,各元素的位置不断的靠近自己的位置,如果在一趟比较下来没有发生果交换,就说明序列已经排好序。

代码实现

package 排序算法;

import java.util.Arrays;

public class 冒泡排序 {
    public static void main(String[] args) {
        int arr[]={3,9,-1,10,20};
        String s = Arrays.toString(arr);//返回数组的字符串形式。
        System.out.println(s);
        BubbleSort(arr);
        String ss = Arrays.toString(arr);
        System.out.println(ss);

    }

    public static void BubbleSort(int[] arr){
        int temp=0;//临时变量
        boolean flag=false;//标识变量,表示是否发生过交换
        for(int i=arr.length-1;i>0;i--){//表示要进行N-1趟
            for(int j=0;j<i;j++){//每一次遍历要将大的数放在后面
               /*
                //如果是逆序,则交换两个元素
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
                */
               if(arr[j]>arr[j+1]){
                   flag=true;
                   arr[j]=arr[j]^arr[j+1];
                   arr[j+1]=arr[j]^arr[j+1];
                   arr[j]=arr[j]^arr[j+1];
               }
            }
            //优化
            if(!flag){//在一趟中没有发生交换
                break;
            }
            else{
                flag=false;//重置flag,进行下次判断
            }
        }
    }
}

学习知识点:

冒泡排序算法

Arrarys类

String s = Arrays.toString(arr);//返回数组的字符串形式。

插入排序

开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

代码实现

     //插入排序
    public static void insertsort(int[] arr){
        //从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for(int i=1;i<arr.length;i++){
            for(int j=i;j>0;j--){  
                if(arr[j]<arr[j-1]){
                    swap(arr,j,j-1);
                }
            }
        }
    }
   //交换两个数
    public static void swap(int [] arr){
              	int temp=arr[i];
        		arr[i]=arr[j];
        		arr[j]=temp;
         }

----------------方法二--------------
        //插入排序
    public static void insertsort(int[] arr){
        //从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for(int i=1;i<arr.length;i++){
            // 记录要插入的数据
            int temp=arr[i];
            // 从已经排序的序列最右边的开始比较,找到比其小的数
            int j=i;
            while (j>0 && temp<arr[j-1]){
                arr[j]=arr[j-1];//用于查找前面是否有更小的值
                j--;
            }
            // 存在比其小的数,插入
            if(j!=i){
                arr[j]=temp;
            }
        }
    }

学习知识点:

插入排序

注意在前面的有序列表中找到要插入的位置。


简单排序总结

冒泡排序--基本不用 太慢
选择排序--基本不用 不稳
插入排序--样本小且基本有序的时候

posted @ 2021-01-09 22:23  胡木杨  阅读(107)  评论(0)    收藏  举报