1:個人學習記錄。
2:大佬請繞道。。。
using system.collections;
using system.collections.generic;
using unityengine;
namespace datastructure.wcc
; #region 穩定排序:歸併排序、氣泡排序、插入排序。
#region 氣泡排序:是相鄰元素之間的比較和交換,兩重迴圈o(n2);所以,如果兩個相鄰元素相等,是不會交換的。所以它是一種穩定的排序方法
/// /// 氣泡排序
///
public void popsort()} }
for (int i = 0; i < listtest.length; i++)
}#endregion
#region 插入排序:每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。
/// /// 插入排序
///
public void insertion()}}
for (int i = 0; i < listtest.length; i++)
}#endregion
#region 歸併排序
//下面用通俗易懂的語言來描述該演算法,歸併排序演算法是乙個自下而上的排序演算法,先使子串行有序,然後合併兩個相鄰子串行,並使得到的序列仍然有序,這樣逐級向上歸併,最終達到使整個序列有序的目的。
//同時歸併排序演算法還有乙個任務,即分割序列,因為我們得到的無序序列是乙個整體,我們需要將它分割開,以供歸併操作使用。
//下面講解演算法實現部分:
//一:向merge_sort函式傳遞要排序的序列array;
//二:merge_sort函式使用二分法將array分割成兩個子串行array[0:mid + 1] 和array[mid + 1:length], 並同時對兩個子串行使用merge_sort函式進行遞迴。由此引申出對merge_sort函式引數的討論,首先它需要array,其次需要所要排序部分的區間,即left和right。
//三:此時已經實現了將序列自上而下進行了分割,還未對序列進行自下而上的歸併。所以應該在分割完成之後進行歸併,且是每一次分割完成之後都需要使用merge函式歸併。即可得到下述**:
public static void merge_sortstart()
;int temps = new int[listtest.length];
merge_sort(listtest, 0, listtest.length - 1, temps);
foreach (int item in listtest)
}static void merge_sort(int array, int left, int right, int temp)
else
}while (l1 <= r1)
while (l2 <= r2)
for (int i = 0; i < k; i++)}}
#endregion
#endregion
#region 不穩定排序:選擇排序、快速排序、堆排序
#region 快排
/*該方法的基本思想是
1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
*//// /// 快排
///
///
public void fastrow()
}void fastrowlist(int vs, int left, int right)
else
}//從前往後找大於當前基準數的位置 現在坑的位置在j
while ( i < j)
else}}
//現在i等於j了 把x儲存的值 給到i的位置
vs[i] = x;
//當前區間分成了left>i>right
//再次遞迴呼叫當前方法
fastrowlist(vs, left, i - 1);
fastrowlist(vs, i + 1, right);}}
#endregion
#region 選擇排序:從待排序的記錄序列中選擇關鍵碼最小(或最大)的記錄並將它與序列中的第乙個記錄交換位置以此類推;
public void selectsort()
}//判斷下當前索引是最小值時
if(k!= i)
}foreach (int item in listtest)
}#endregion
#region 堆排序
//堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a[parent[i]] >= a[i]。
//在陣列的公升序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。
public static void testheapsort()
;heapsort(listtest);
foreach (var item in listtest)
}private static void heapsort(int array)
}private static void maxheap(int array)
}private static void heapify(int array, int index, int size)
if (right < size && array[right] > array[large])
if (index != large)
}/// /// 交換
///
///
///
private static void swap(ref int first, ref int second)
#endregion
#endregion
}}
常用排序演算法(java版)
概述 1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 直接選擇排序 堆排序 4 歸併排序 5 分配排序 基數排序 所需輔助空間最多 歸併排序 所需輔助空間最少 堆排序 平均速度最快 快速排序 不穩定 快速排序,希爾排序,堆排序。當n較大,則應採用時間複雜度為o ...
常用演算法(C版)
演算法 algorithm 計算機解題的基本思想方法和步驟。演算法的描述 是對要解決乙個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼資料 輸入什麼資料 輸出什麼結果 採用什麼結構 使用什麼語句以及如何安排這些語句等。通常使用自然語言 結構化流程圖 偽 等來描述演算法。一 計數 求和 求...
排序演算法總結 C 版)
1 時間複雜度 分析關鍵字比較次數和記錄的移動次數 2 空間複雜度 需要的輔助記憶體 3 穩定性 相同的關鍵字計算後,次序是否不變。直接插入排序 insertionsort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。例如 ...