算法之排序算法

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;
    

 

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

算法学习——递归之快速排序

排序算法之高速排序

算法之快速排序

算法-排序系列04之快速排序

排序算法之快速排序

算法图解之快速排序