排序算法總結

排序算法總結

山東大學劉鵬昊

  • 選擇排序

    • 思想

      找出最大的元素移動到最后 然后找出次大的元素移動到倒數第二位 依次進行
    • 算法代碼

      int* select_sort(int *s,int n){
      int tmp_pos;
      for (int i = n-1; i >= 1; --i) {
          tmp_pos = i;
          for (int j = 0; j < i; ++j) {
              if (s[j]>s[tmp_pos])
                  tmp_pos = j;
          }
          if (tmp_pos!=i){
              swap(s[i],s[tmp_pos]);
          }
      }
      }
      
    • 穩定性

      不穩定
    • 復雜度

      O(n2)
  • 冒泡排序
    • 思想

      從最低位開始相鄰元素相互比較交換位置 每次都能保證最大元素移動到最右邊 n-1次后完成
    • 算法代碼

      int* bubble_sort(int *s,int n){
      
      for (int i = n-1; i >=1 ; --i) {
          for (int j = 0; j < i; ++j) {
              if (s[j]>s[j+1]){
                  swap(s[j],s[j+1]);
              }
          }
      }
      }
      
    • 穩定性

      穩定
    • 復雜度

      O(n2)
  • 插入排序
    • 思想

      從最低位開始相鄰元素相互比較交換位置 每次都能保證最大元素移動到最右邊 n-1次后完成
    • 算法代碼

        int* insertion_sort(int *s,int n)
      {
      for (int i = 1; i < n; i++)
      {
          if (s[i - 1] > s[i])
          {
              int temp = s[i];
              int j = i;
              while (j > 0 && s[j - 1] > temp)
              {
                  s[j] = s[j - 1];
                  j--;
              }
              s[j] = temp;
          }
      }
      return s;
      }
      
    • 穩定性

      穩定
    • 復雜度

      O(n2)
  • 快速排序
    • 思想

      將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小 然后遞歸分別快速排序這兩部分
    • 算法代碼

      void quick_sort(int a[], int low, int high)
      {
      if(low >= high)
      {
          return;
      }
      int first = low;
      int last = high;
      int key = a[first];
      
      while(first < last)
      {
          while(first < last && a[last] >= key)
          {
              --last;
          }
      
          a[first] = a[last];
      
          while(first < last && a[first] <= key)
          {
              ++first;
          }
      
          a[last] = a[first];
      }
      a[first] = key;
      quick_sort(a, low, first-1);
      quick_sort(a, first+1, high);
      }
      
    • 穩定性

      不穩定
    • 復雜度

      O(nlog(n))
  • 箱子排序
    • 思想

      將每個元素抽象為關鍵字(可排序的) 然后遍歷依次放入相應關鍵字的箱子中 然后順序輸出 就是有序的
    • 算法代碼

    Node_list<T> *bin = new Node_list<T>[range];
     T maximum = data[0];
     for (int i = 0; i < length; ++i) {
         if (data[i] > maximum) {
             maximum = data[i];
         }
     }
     int loop_value = range;
     do {
         for (int i = 0; i < length; ++i) {
             bin[data[i] % loop_value / (loop_value / range)].push(data[i]);
         }
         int index_in_bin = 0;
         for (int i = 0; i < length; ++i) {
             while (bin[index_in_bin].length == 0) {
                 index_in_bin++;
             }
             data[i] = bin[index_in_bin].shift();
              }
    
         loop_value *= range;
    
         cout << "step : ";
         output();
     } while (loop_value / range <= maximum);
    
    
    • 穩定性

      不穩定
    • 復雜度

      O(n)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,768評論 0 33
  • Sort Algorithm(ASC) [TOC] //怎么生成目錄,糾結ing 插入排序 每一趟排序都將待排元素...
    一條小袍袍YoY閱讀 451評論 0 1
  • 題記: 直接插入排序(穩定)-->希爾排序 : 屬于插入排序 簡單選擇排序(穩定)-->堆排序 :屬于選擇排序...
    Pitfalls閱讀 2,826評論 2 3
  • 1.簡介插入排序(Insertion Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列...
    AngerCow閱讀 388評論 0 1
  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,215評論 0 52