算法之排序算法

Posted strandtrack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之排序算法相关的知识,希望对你有一定的参考价值。

1.冒泡排序

思想:

两个两个的比较,第一和第二比,如果第一<第二,交换位置,接着第一和第三比,同样小的放前面,这样走一轮最后一位就确定绝对是最大的。然后再走第二轮第三轮,直到所有位置都确定。

代码实现:

package sort;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = new int[800];
        for(int i =0; i < 800;i++) {
            arr[i] = (int)(Math.random() * 8000);

        }
        System.out.println(Arrays.toString(arr));
        bsort(arr);
        System.out.println(Arrays.toString(arr));

    }
    public static void bsort(int [] arr){

        int temp;
        boolean flag=false;//是否交换,为交换为false
        for (int i=0;i<arr.length-1;i++)
        {
            for (int j=0;j<arr.length-1;j++)
            {
                if(arr[j]>arr[j+1])
                {
                    flag=true;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            if(!flag){
                break;
            }
            else {
                flag=true;
            }
        }
    }
}

 

2.选择排序

思想:

先把第一个值假设为最小的,然后与后面的数一一对比,如果后面的数比他小就设为最小数,走一轮之后确定一个最终的最小的数,然后把它的值与数组中的第一个数交换。这样第一个数就是最小的数,下一轮从第二个值开始,同样的方法选出第二小的数,一直到倒数第二个的值选出,排序就完成了。

代码实现:

package sort;

import java.util.Arrays;

public class SelectSort {
    public static void main(String[] args) {
        int[] arr = new int[800];
        for(int i =0; i < 800;i++) {
            arr[i] = (int)(Math.random() * 8000);

        }
        System.out.println(Arrays.toString(arr));
        ssort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void ssort(int [] arr)
    {
        for(int i=0;i<arr.length-1;i++)
        {
            int min=arr[i];
            int minIndex=i;
            for(int j=i+1;j<arr.length;j++)
            {
               if(min>arr[j])
               {
                   min=arr[j];
                   minIndex=j;
               }
            }
           if(minIndex!=i)
           {
               arr[minIndex] =arr[i];
               arr[i]=min;
           }


        }
    }

}

 

3.希尔排序

思想:

代码实现:

package sort;

import java.util.Arrays;

public class ShellSort {
    public static void main(String[] args) {
       int[] arr = new int[800];
        for(int i =0; i < 800;i++) {
            arr[i] = (int)(Math.random() * 8000);

        }
        
        System.out.println(Arrays.toString(arr));
        ssort(arr);
        System.out.println(Arrays.toString(arr));
    }

    //希尔排序之交换法
    public static void ssort(int [] arr)
    {
        int temp;

        for(int book=arr.length/2;book>0;book/=2)
        {
            for(int i=book;i<arr.length;i++)
            {
                for(int j=i-book;j>=0;j-=book)
                {
                    if(arr[j+book]<arr[j])
                    {
                        temp=arr[j+book];
                        arr[j+book]=arr[j];
                        arr[j]=temp;
                    }
                }
            }
        }
    }

}

4.快速排序

思想:

设置一个基准数,假设就是数组的最左边,arr[0],在数组的左边和右边用两个变量i和j记录,首先j开始出动往左边走(必须是在基准数反方向的变量先出发,因为如果从相同方向找比基准数大的如果i=j了,这个时候就需要交换基准数和i所在的数,这个数是大于基准数的,我们要的是小于基准数的在左边,这就不对了),找到一个小于基准数的数后停下来,然后i开始走,走到大于基准数停下来,这时候两个变量所在的数组交换,然后继续j先走,i后走,交换。直到i和j相等的时候,这个时候把这个arr[i]和基准数的位置arr[0]交换,这个时候基准数所在的位置左边都小于他,右边都大于他。然后递归分为两个:

  • 基准数左边的
  • 基准数右边的

代码实现:

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = new int[800];
        for(int i =0; i < 800;i++) {
            arr[i] = (int)(Math.random() * 8000);

        }
        System.out.println(Arrays.toString(arr));
        int j=arr.length-1;
        qsort(arr,0,j);
        System.out.println(Arrays.toString(arr));
    }
    public static void qsort(int[] arr,int left,int right) {
        int i,j,temp,t;
        if(left>right)
            return;
       //作为基准数
       temp=arr[left];
       i=left;
       j=right;
       while (i!=j)
       {
           //找到小于基准数的停止
           while (arr[j]>=temp &&i<j)
           {
               j--;

           }
           //找到大于基准数停止
           while (arr[i]<=temp && i<j)
           {
               i++;
           }
           if(i<j)
           {
               t=arr[j];
               arr[j]=arr[i];
               arr[i]=t;
           }

       }
      arr[left]=arr[i];
       arr[i]=temp;

       qsort(arr,left,i-1);
       qsort(arr,i+1,right);
       return;
    }
}

 

以上是关于算法之排序算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

排序算法之归并排序

7种基本排序算法的Java实现

重学数据结构和算法之归并排序快速排序

排序算法之希尔排序