[Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)

Recently I systematicall review some sorting algorithms, including insertion sort, bubble sort, merge sort and quick sort. I then implement them in C++. All the function takes in a  vector<int>& type and directly operates on the input. To use the following code, you need to add the following code to your headers.

1 #include <iostream>
2 #include <vector>
3 #include <ctime> // for randomization in quicksort
4 
5 using namespace std;

 Insertion Sort:

1 // Insertion sort
2 void insertionSort(vector<int>& arr) {
3     for (int j = 1; j < (signed)arr.size(); j++)
4         for (int i = j - 1; i >= 0 && arr[i] > arr[i + 1]; i--)
5             swap(arr[i], arr[i + 1]);
6 }

Bubble Sort:

1 // Bubble sort
2 void bubbleSort(vector<int>& arr) {
3     for (int i = 0; i < (signed)arr.size() - 1; i++)
4         for (int j = i + 1; j < (signed)arr.size(); j++)
5             if (arr[i] > arr[j]) swap(arr[i], arr[j]);
6 }

Merge Sort:

 1 // Merge sort
 2 void merge(vector<int>& arr, int left, int mid, int right) {
 3     if (left >= right) return;
 4     vector<int> larr(arr.begin() + left, arr.begin() + mid + 1);
 5     vector<int> rarr(arr.begin() + mid + 1, arr.begin() + right + 1);
 6     int i = 0, j = 0, pos = left;
 7     while(i < (signed)larr.size() && j < (signed)rarr.size()) {
 8         if (larr[i] > rarr[j]) arr[pos++] = rarr[j++];
 9         else arr[pos++] = larr[i++];
10     }
11     while (i < (signed)larr.size()) arr[pos++] = larr[i++];
12     while (j < (signed)rarr.size()) arr[pos++] = rarr[j++];
13 }
14 
15 void mergeSortHelper(vector<int>& arr, int left, int right) {
16     if (left >= right) return;
17     int mid = (left + right) / 2;
18     mergeSortHelper(arr, left, mid);
19     mergeSortHelper(arr, mid + 1, right);
20     merge(arr, left, mid, right);
21 }
22 
23 void mergeSort(vector<int>& arr) {
24     mergeSortHelper(arr, 0, arr.size() - 1);
25 }

Quicksort:

 1 // Quicksort
 2 int partition(vector<int>& arr, int left, int right) {
 3     // Introduce randomization
 4     srand((unsigned)time(0));
 5     int rndIdx = rand() % (right - left + 1) + left;
 6     swap(arr[rndIdx], arr[left]);
 7     int l = left + 1, r = right;
 8     while (l <= r) {
 9         if (arr[l] > arr[left] && arr[r] < arr[left])
10             swap(arr[l], arr[r]);
11         if (arr[l] <= arr[left]) l++;
12         if (arr[r] >= arr[left]) r--;
13     }
14     swap(arr[left], arr[r]);
15     return r;
16 }
17 
18 void quickSortHelper(vector<int> &arr, int left, int right) {
19     if (left >= right) return;
20     int pivot = partition(arr, left, right);
21     quickSortHelper(arr, left, pivot - 1);
22     quickSortHelper(arr, pivot + 1, right);
23 }
24 
25 void quickSort(vector<int>& arr) {
26     quickSortHelper(arr, 0, arr.size() - 1);
27 }

Welcome for any question, comment and suggestion about the code!

posted @ 2015-06-04 22:45  jianchao-li  阅读(362)  评论(0编辑  收藏  举报