遞歸算法
任何一個方法既能夠調用其餘方法又能夠調用本身,而當這個方法調用本身時,咱們就叫它遞歸函數或者遞歸方法!數組
一般遞歸有兩個特色: 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);
}
快速排序
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)。
外排序
1. Bit-map的基本思想 32位機器上,對於一個整型數,好比int a=1 在內存中佔32bit位,這是爲了方便計算機的運算。可是對於某些應用場景而言,這屬於一種巨大的浪費,由於咱們能夠用對應的32bit位對應存儲十進制的0-31個數,而這就是Bit-map的基本思想。Bit-map算法利用這種思想處理大量數據的排序、查詢以及去重。 Bitmap在用戶羣作交集和並集運算的時候也有極大的便利。