C#算法

遞歸算法

 

任何一個方法既能夠調用其餘方法又能夠調用本身,而當這個方法調用本身時,咱們就叫它遞歸函數或者遞歸方法!數組

一般遞歸有兩個特色:    ide

1.遞歸方法一直會調用本身直到某些條件知足,也就是說必定要有出口;函數

2.遞歸方法會有一些參數,而它會把這些新的參數值傳遞給本身;(本身調本身);性能

冒泡排序ui

經過相鄰兩個值的大小比較(屢次),保證數值排序爲從小到大的排序方法。spa

    效果及實現原理:外層的數列個數次的循環,每次循環會將最大的數值「冒泡」到右端,由於是相鄰的兩兩比較。排序

    具體實現:雙重循環,外層數列個數次,保證每個數值都處於正確位置(由於每循環一次,至少會肯定一個數值的正確位置),內層從數列個數次逐漸減小次數,由於每一次外層循環會肯定最大值、倒數第二大值……咱們在下一次循環就能夠忽略掉他們。遞歸

 

插入排序內存

插入排序(Insert Sort):本質上是待排序列裏的元素一個一個的與已排列好的元素進行比較,將其插入到已排列好的序列中,直到沒有待排列的元素。相似於打牌的時候摸牌的動做:手上的牌是排列好的,桌子上的牌是待排序的,每從桌子上抓到一隻牌,按照必定次序將其插入到手中

int i = 0, j = 0;
int key;
for (j = 1; j < array.Length; j++)
{
  key = array[j];
  i = j - 1;
  while (i >= 0 && array[i] > key)
  {
    array[i + 1] = array[i];
    i -= 1;
  }
  array[i + 1] = key;
  Console.Write("Step {0}:", j);
  DisplayArrayToConsole(array);
}

 

快速排序

快速排序(Quicksort)是對 冒泡排序的一種改進。
(在數據量小於20的時候,插入排序具備最好的性能。當大於20時,快速排序具備最好的性能,歸併(merge sort)和堆排序(heap sort)也可望不可即,儘管複雜度都爲nlog2(n)。)
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。
由此思想,咱們能夠實現快速排序的代碼:
注意基準數據永遠不變,永遠是和基準數據進行比較,不管在什麼位置,最後的目的就是把基準數據放在中間,小的放前面大的放後面。

namespace QuickSort
{
class QuickSort
{
private int Func(int[] n, int left, int right)
{
  int baseNum = n[left]; // 基準數據

  int i = left;
  int j = right;
  while (true)
  {
    if (n[i] < baseNum && i < j)
    {
      i++;
    }
    else if (n[i] > baseNum && i < j)
    {
      int number = n[i];
      n[i] = n[j];
      n[j] = number;
      j--;
    }
    else if (n[j] < baseNum && i < j)
    {
      int number = n[i];
      n[i] = n[j];
      n[j] = number;
      i++;
    }
    else if (n[j] > baseNum && i < j)
    {
      j--;
    }
    else if (i == j)
    {
      n[i] = baseNum;
      break;
    }
  }
  return i;
}

public void QuickSortFunc(int[] n, int left, int right)
{
  //左下標必定小於右下標,不然就超越了
  if (left < right)
  {
    //對數組進行分割,取出下次分割的基準標號
    int i = Func(n, left, right);

    //對「基準標號「左側的一組數值進行遞歸的切割,以致於將這些數值完整的排序
    QuickSortFunc(n, left, i - 1);

    //對「基準標號「右側的一組數值進行遞歸的切割,以致於將這些數值完整的排序
    QuickSortFunc(n, i + 1, right);

  }
}
static void Main(string[] args)
{
  int[] n = { 23, 45, 60, 10, 17, 101,12};
  QuickSort qs = new QuickSort();
  qs.QuickSortFunc(n, 0, n.Length - 1);
  for (int i = 0; i < n.Length; i++)
  {  
    Console.WriteLine(n[i]);
  }

  Console.ReadLine();
}
}
}

歸併排序

 歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題(divide)成一些小的問題而後遞歸求解,而治(conquer)的階段則將分的階段獲得的各答案"修補"在一塊兒,即分而治之)。

而它的時間複雜度就是N*logN,此算法採用的是二分法,因此能夠認爲對應的對數函數底數爲2,也有多是三分法,底數爲3,以此類推。

每次合併操做的平均時間複雜度爲O(n),而徹底二叉樹的深度爲|log2n|。總的平均時間複雜度爲O(nlogn)。並且,歸併排序的最好,最壞,平均時間複雜度均爲O(nlogn)。

 

外排序

 

Bit-map空間壓縮和快速排序去重

1. Bit-map的基本思想  32位機器上,對於一個整型數,好比int a=1 在內存中佔32bit位,這是爲了方便計算機的運算。可是對於某些應用場景而言,這屬於一種巨大的浪費,由於咱們能夠用對應的32bit位對應存儲十進制的0-31個數,而這就是Bit-map的基本思想。Bit-map算法利用這種思想處理大量數據的排序、查詢以及去重。  Bitmap在用戶羣作交集和並集運算的時候也有極大的便利。

相關文章
相關標籤/搜索