Sorting
Selection Sort
Bubble Sort
Insertion Sort
Quick Sort
Merge Sort
Last updated
Last updated
void Swap(int[] array, int index1, int index2){
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
void SelectionSort(int[] array){
var n = array.Length - 1;
for(int i = 0; i <= n; i++){
var minIdx = i;
for(int j = i + 1; j <= n; j++){
if(array[j] < array[minIdx]){
minIdx = j;
}
}
Swap(array, minIdx, i);
}
}void BubbleSort(int[] array){
var n = array.Length;
for(int i = 0; i < n - 1; i++){
for(int j = 0; j < n - i - 1; j++){
if(array[j] > array[j + 1]){
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}void InsertionSort(int[] array){
var n = array.Length - 1;
for(int i = 1; i <= n; i++){
var unsortedItem = array[i];
var comparingItemIndex = i - 1;
while(comparingItemIndex >= 0 && unsortedItem < array[comparingItemIndex]){
array[comparingItemIndex + 1] = array[comparingItemIndex];
comparingItemIndex--;
}
array[comparingItemIndex + 1] = unsortedItem;
}
}void Swap(int[] array, int index1, int index2){
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
int Partition(int[] array, int lowIdx, int highIdx){
var pivot = array[highIdx];
var possibleIdx = lowIdx - 1;
for(int i = lowIdx; i < highIdx; i++){
if(array[i] <= pivot){
possibleIdx++;
Swap(array, i, possibleIdx);
}
}
possibleIdx++;
Swap(array, possibleIdx, highIdx);
return possibleIdx;
}
void QuickSort(int[] array, int startIdx, int endIdx){
if(startIdx < endIdx){
var pivotIdx = Partition(array, startIdx, endIdx);
if(startIdx < pivotIdx - 1) // sort left half
QuickSort(array, startIdx, pivotIdx - 1);
if(pivotIdx < endIdx) // sort right half
QuickSort(array, pivotIdx, endIdx);
}
}void MergeSort(int[] array){
int[] helper = new int[array.Length];
MergeSort(array, helper, 0, array.Length - 1);
}
void MergeSort(int[] array, int[] helper, int lowIdx, int highIdx){
if(lowIdx < highIdx){
int middleIdx = (lowIdx + highIdx) / 2;
MergeSort(array, helper, lowIdx, middleIdx); //sort left half
MergeSort(array, helper, middleIdx + 1, highIdx); //sort right half
Merge(array, helper, lowIdx, middleIdx, highIdx);
}
}
void Merge(int[] array, int[] helper, int lowIdx, int middleIdx, int highIdx){
/* Copy both halves into a helper array */
for(int i = lowIdx; i <= highIdx; i++){
helper[i] = array[i];
}
int helperLeft = lowIdx;
int helperRight = middleIdx + 1;
int currentIdx = lowIdx;
while(helperLeft <= middleIdx && helperRight <= highIdx){
// if left element is smaller than the right element
if(helper[helperLeft] <= helper[helperRight]){
array[currentIdx] = helper[helperLeft];
helperLeft++;
}
// else if right element is smaller than the left element
else{
array[currentIdx] = helper[helperRight];
helperRight++;
}
currentIdx++;
}
int remaining = middleIdx - helperLeft;
for(int i = 0; i <= remaining; i++){
array[currentIdx + i] = helper[helperLeft + i];
}
}