快速排序与选择排序

快速排序与选择排序

 

一,快速排序

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

1. 算法步骤

1.      从数列中挑出一个元素,称为 "基准"(pivot);

2.      重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

3.      递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

 

 

2.代码实现

    /**
       * arr 排序数组
       * left 开始坐标
       * right 结束坐标
       */
      public   static  void quicksort(int[] arr, int left, int right) {
          //设置关键数据key为要排序数组的第一个元素
          int key=arr[left];
          //设置数组坐标的索引,往右移动判断比key大的数
          int i= left;
          //设置数组右边的索引,往左移动判断比key小的数
          int j=right;
          //如果左边索引比右边索引小,则还有数据没有排序
          while(i<j){
              while(arr[j]>key &&   j>left){
                  j--;
              }
              while(arr[i]<key &&   i<right){
                  i++;
      

党政政务长标题

        }
              if(i<j){
                  int temp=arr[i];
                  arr[i]=arr[j];
                  arr[j]=temp;
              }
          }
          //如果左边索引比右边大,说明第一次排序完成将arr[j]与key对换,
          //保持了key左边的数比key小,key右边的数比key大
          if(i>j){
              int temp=arr[j];
              arr[j]=arr[left];
              arr[left]=temp;
          }
          //递归调用
          if(j>left &&   j<right){
              quicksort(arr,left,j-1);
              quicksort(arr,j+1,right);
          }
 
      }
  }

 

 

结果:

image.png

 

 

 

 

 

 

二.选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

 

 

1. 算法步骤

第一次从下标为0的开始下标为0的这个数与后面的n-1个进行比较;找出最小或者最大的放在下标为0的这个位置;第二次从下标为1的开始比较;查询剩下的最大或者最小值;放在 下标为1的位置;以此类推;直到排序完成。

 

image.png

 

2.代码实现

/**
 * 选择排序
 * 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
 * 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
 * 选择排序是不稳定的排序方法。
 * @author liangge
 **/
  public class selectSort {
 
  public static void main(String[] args) {
    Random random =new Random();
    //定义数组长度
    int sort[]=new int[10];
    for(int i=0;i<10;i++){
        sort[i]=random.nextInt(20);
    }
    System.out.println("排序前数组为:");
    for(int i:sort){
        System.out.print(i+",");
    }
    selectionSort(sort);
    System.out.println();
 
    System.out.println("排序后的数组为:");
    for(int i:sort){
        System.out.print(i+",");
    }
 
 
 
}
 
    private static void selectionSort(int[] sort) {
    for(int i=0;i<sort.length-1;i++){
        for(int j=i+1;j<sort.length;j++){
            if(sort[i]>sort[j]){
                int temp=sort[i];
                sort[i]=sort[j];
                sort[j]=temp;
            }
        }
    }
 
    }
}
 

 

 

结果:

 

 

 

 

 

 

 

 

image.png

 

posted @ 2019-07-30 21:35  天山云海  阅读(711)  评论(0)    收藏  举报