unity C# 常用算法 和 算法複雜度

1、穩定性

歸併排序、冒泡排序、插入排序。基數排序是穩定的

選擇排序、快速排序、希爾排序、堆排序是不穩定的

2、時間複雜度

最基礎的四個算法:冒泡、選擇、插入、快排中,快排的時間複雜度最小O(n*log2n),其他都是O(n2)

3.排序算法的思想:

(1)冒泡排序:

是相鄰元素之間的比較和交換,兩重循環O(n2);所以,如果兩個相鄰元素相等,是不會交換的。所以它是一種穩定的排序方法

public void PopSort(int[] list)

{

int i, j, temp; //先定義一下要用的變量

for (i = 0; i < list.Length - 1; i++)

{

for (j = i + 1; j < list.Length; j++)

{

if (list[i] > list[j]) //如果第二個小於第一個數

{

//交換兩個數的位置,在這裏你也可以單獨寫一個交換方法,在此調用就行了

temp = list[i]; //把大的數放在一個臨時存儲位置

list[i] = list[j]; //然後把小的數賦給前一個,保證每趟排序前面的最小

list[j] = temp; //然後把臨時位置的那個大數賦給後一個

}

}

}

}

(2)選擇排序:

每個元素都與第一個元素相比,產生交換,兩重循環O(n2);舉個栗子,5 8 5 2 9,第一遍之後,2會與5交換,那麼原序列中兩個5的順序就被破壞了。所以不是穩定的排序算法

///

/// 選擇排序

///

public class SelectionSorter

{

// public enum comp {COMP_LESS,COMP_EQUAL,COMP_GRTR};

private int min;

// private int m=0;

public void Sort(int[] list)

{

for (int i = 0; i < list.Length - 1; ++i)

{

min = i;

for (int j = i + 1; j < list.Length; ++j)

{

if (list[j] < list[min])

min = j;

}

int t = list[min];

list[min] = list[i];

list[i] = t;

// Console.WriteLine("{0}",list[i]);

}

}

}

(3)插入排序:

插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。剛開始這個小序列只包含第一個元素,事件複雜度O(n2)。比較是從這個小序列的末尾開始的。想要插入的元素和小序列的最大者開始比起,如果比它大則直接插在其後面,否則一直往前找它該插入的位置。如果遇見了一個和插入元素相等的,則把插入元素放在這個相等元素的後面。所以相等元素間的順序沒有改變,是穩定的。

///

/// 插入排序

///

public class InsertionSorter

{

public void Sort(int[] list)

{

for (int i = 1; i < list.Length; ++i)

{

int t = list[i];

int j = i;

while ((j > 0) && (list[j - 1] > t))

{

list[j] = list[j - 1];

--j;

}

list[j] = t;

}

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章