排序之選擇排序

  • 排序是將一串數據按照其某個或者某些關鍵字的大小進行遞增或遞減排列的操做我,一般指的排序是升序,排序方式是原地排序
  • 下面介紹下選擇排序

選擇排序

  • 原理:從無序區間中找到最大(最小)的元素,將其放於無序區間的後面(前面),直到全部無序區間內的元素排完後,排序結束
  • 插入排序是一個不穩定的排序

實現方式

  1. 單向選擇排序
    • 遍歷無序區間選擇出最大的值,放在無序列表的後面
    • 代碼:
      public void selectSort(int[] array) {
              for(int i = 0; i < array.length - 1; i++) {
                      //無序區間是[0, array.length - i)
                      //有序區間是[array.length - i, array.length)
                      int max = 0;
                      for(int j = 0; j < array.length - i; j++) {
                              if(array[j] > array[max]) {
                                      max = j;
                              }
                      }
                      int tmp = array[max];
                      array[max] = array[array.length - 1 - i];
                      array[array.length - 1 - i] = tmp;
              }
      }
  2. 雙向選擇排序ide

    • 遍歷無序區間,找出無序區間中的最大值和最小值,將最小值放在無序區間的前面,將最大值放在無序區間的後面,直到將無序區間的元素都排完
    • 代碼:性能

      public void selectSortOP(int[] array) {
              int left = 0;
              int right = array.length - 1;
      
              while(left <= right) {
                      int min = left;
                      int max = left;
                      //遍歷無序區間,找到最大值和最小值的下標
                      for(int i = left + 1; i <= right; i++) {
                              if(array[i] > array[max]) {
                                      max = i;
                              }
                              if(array[i] < array[min]) {
                                      min = i;
                              }
                      }
                      swap(array, min, left);
                      //判斷最大的值是否在最左側,若是是在最左側的話因爲最小的元素已經和他進行了交換,此時最大值的下標就
                      //再也不是left,而是交換後的min
                      if (max == left) {
                              max = min;
                      }
                      swap(array, max, right);
                      left++;
                      right--;
              }
      }
      
      private void swap(int[] array, int i, int j) {
              int tmp = array[i];
              array[i] = array[j];
              array[j] = tmp;
      }

性能分析

  • 時間複雜度:O(N^2)
  • 空間複雜度:O(1)
  • 穩定性:不穩定
相關文章
相關標籤/搜索