c#實現所有經典排序演算法
1、選擇排序
選擇排序
原理:選擇排序是從氣泡排序演化而來的,每一輪比較得出最小的那個值,然後依次和每輪比較的第乙個值進行交換。
目的:按從小到大排序。
方法:假設存在陣列:72, 54, 59, 30, 31, 78, 2, 77, 82, 72
第一輪依次比較相鄰兩個元素,將最小的乙個元素的索引和值記錄下來,然後和第乙個元素進行交換。
如上面的陣列中,首先比較的是72,54,記錄比較小的索引是54的索引1。接著比較54和59,比較小的索引還是1。直到最後得到最小的索引是2的索引6,然後索引6和0互相交換。
第二輪比較的時候是最小的乙個元素和索引1進行交換。第三輪、第四輪以此類推。
class selectionsorter
int t = arr[min];
arr[min] = arr[i];
arr[i] = t;
}
} } 2
、氣泡排序
氣泡排序
原理:以此比較相鄰的兩個元素,每次比較完畢最大的乙個字跑到本輪的末尾。
目的:按從小到大排序。
方法:
假設存在陣列:72, 54, 59, 30, 31, 78, 2, 77, 82, 72
第一輪比較相鄰兩個元素,如果左邊元素大於右邊元素,則交換。
72和54比較的結果就是,54在前,72在後;
然後72和59比較的結果,59在前,72在後;
以此類推,第一輪比較之後的結果是:54, 59, 30, 31, 72, 2, 77, 78, 72, 82
經過第一輪比較,最大的元素跑到了最後乙個,所以第二輪比較,最後乙個元素不需要進行比較了。
第二輪還是從索引0和1開始比較,只是不許要比較最後乙個了,演算法還是一樣的。第三輪、第四輪以此類推。
排序之後的結果:2, 30, 31, 54, 59, 72, 72, 77, 78, 82
class ebullitionsorter
}
j++;
}
} } 3
、快速排序
快速排序
原理:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,
然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
class quicksorter
public void sort(int list, int low, int high)
mid = (low + high) >> 1;
pivot = list[mid];
swap(ref list[low], ref list[mid]);
l = low + 1;
r = high;
do
while (l < r);
list[low] = list[r];
list[r] = pivot;
if (low + 1 < r)
sort(list, low, r - 1);
if (r + 1 < high)
sort(list, r + 1, high);
}
}
4、插入排序
插入排序
原理:插入排序分為直接插入排序和希爾排序
每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子列表當中的適當位置,直到全部記錄插入完成為止。
對直接插入排序我的理解就是:先將第乙個記錄視為乙個有序序列,然後依次將後面的記錄插入到這個有序序列中來。每次要插入的記錄時,須從後往前依次比較有序序列中的記錄,直到找到在有序序列中的位置,記錄下該位置,該位置開始的每個記錄都後移一位,然後將插入記錄插入該位置。這樣每插入乙個記錄進去,有序序列長度加1,剩餘記錄減1,直到所有記錄都插入到有序序列中,排序完成。
public class insertionsorter
arr[j] = t;
}
}
}
5、希爾排序
希爾排序:也稱縮小增量排序。將記錄序列分成若干子串行,每個子串行分別進行插入排序。關鍵是這種子串行不是由相鄰記錄構成的,而是按一定間隔從序列取出來組成的。在直接插入排序演算法中,每次插入乙個數,使有序序列只增加1個節點, 並且對插入下乙個數沒有提供任何幫助。如果比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。d.l.shell於2023年在以他名字命名的排序演算法中實現了這一思想。演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。
希爾排序
public class shellsorter
arr[j - 1] = t;
}
}
}
}
6、歸併排序
歸併排序
原理:歸併排序是一種能將一串資料依照特定排序方式進行排列的一種演算法。最常用到的排序方式是數值順序以及字典順序。有效的排序演算法在一些演算法(例如搜尋演算法與合併演算法)中是重要的,如此這些演算法才能得到正確解答。排序演算法也用在處理文字資料以及產生人類可讀的輸出結果。
///
///
歸併排序之歸:歸併排序入口
///
///
無序的陣列
///
有序陣列
/// lihua(
www.zivsoft.com)>
int sort(int data)
if (data.length <= 1)//
只剩下1 or 0
個元數,返回,不排序
int i = 0, j = 0;
foreach (int x in data)//
開始排序
else//
填充右陣列 }
left = sort(left);//
遞迴左陣列
right = sort(right);//
遞迴右陣列
result = merge(left, right);//
開始排序
輸出排序
,測試用
(lihua debug)
return result;
} ///
///
歸併排序之並
:排序在這一步
///
///
左陣列///
右陣列///
合併左右陣列排序後返回
int merge(int a, int b)
else//
左陣列中元素大於右陣列中元素 }
while (i < a.length)//
這裡其實是還有左元素,但沒有右元素
while (j < b.length)//
右右元素,無左元素
C 實現所有經典排序演算法
c 實現所有經典排序演算法 1 選擇排序 希爾排序 public class shellsorter arr j 1 t static void main string args shellsorter s new shellsorter s.sort array foreach int m in ...
C 實現所有經典排序演算法
選擇排序 class selectionsorter int t arr min arr min arr i arr i t static void main string args selectionsorter s new selectionsorter s.sort array foreach...
C 實現所有經典排序演算法
選擇排序 class selectionsorter int t arr min arr min arr i arr i t static void main string args selectionsorter s new selectionsorter s.sort array foreach...