C 版 常用排序演算法。

2021-10-08 19:26:58 字數 3012 閱讀 9238

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 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。例如 ...