各种常见排序函数的C++代码

来源:互联网 发布:软件企业认定条件 编辑:程序博客网 时间:2024/05/16 06:00
#include <iostream>using namespace std;/**********直接插入排序****************/void InsertSort(int *a, int len){for (int i = 0; i != len -1; ++i)//i代表已经排好序的元素下标{int tar = a[i+1];for (int j = i; j >= 0; --j){if (tar < a[j])a[j + 1] = a[j];else{a[j + 1] = tar;break;}}}}/**********希尔排序******************///希尔排序是插入排序的加强版void ShellSort(int *a, int len){for (int gap = len / 2; gap > 0; gap /= 2)for (int i = gap; i != len ; ++i)for (int j = i; j - gap >= 0 && a[j - gap] > a[j]; j -= gap)swap(a[j], a[j - gap]);}/**********最大堆排序****************///获取父节点int Parent(int i){return (i-1)/ 2;}//获得左孩子和右孩子节点int Left(int i){return 2 * i + 1;}int Right(int i){return 2 * i + 2;}void Filter(int *a, int i, int len)//自上到下梳理一遍路径{int left = Left(i);int right = Right(i);int largest;if (left <= len - 1 && a[left] > a[i])//寻找最大节点的下标,然后让他和i交换largest = left;elselargest = i;if (right <= len - 1 && a[right] > a[largest])largest = right;if (largest != i){swap(a[i], a[largest]);Filter(a, largest, len);}}void BuildHeap(int *a, int len){for (int i = len / 2; i >= 0; --i)Filter(a, i, len);}void HeapSort(int *a, int len){BuildHeap(a, len);//cout << len;for (int i = len -1; i != 0; --i){swap(a[0], a[i]);len--;Filter(a, 0, len);}}/**********快速排序****************/void QuickSortHelp(int e[], int first, int end){int i = first, j = end;int temp = e[i];while (i < j){while (e[j]> temp)j--;e[i] = e[j];while (i < j)i++;e[j] = e[i];}e[i] = temp;if (i - 1 > first)QuickSortHelp(e, first, i - 1);if (end > i + 1)QuickSortHelp(e, i + 1, end);}void QuickSort(int e[], int len){QuickSortHelp(e, 0, len - 1);}/**********冒泡排序****************/void BubbleSort(int a[], int len){for (int i = 0; i != len - 1; ++i){for (int j = 0; j != len - 1 - i; ++j){if (a[j] > a[j + 1])swap(a[j + 1], a[j]);}}}/**********归并排序****************/void MergeHelp(int a[], int start, int mid, int end, int temp[]){int tempIndex = 0, i = start, j = mid + 1;//if (i <= mid && mid + 1 <= end){while (i <= mid && j <= end){if (a[i] > a[j])temp[tempIndex++] = a[i++];else temp[tempIndex++] = a[j++];}while (i <= mid)temp[tempIndex++] = a[i++];while (j <= end)temp[tempIndex++] = a[j++];for (int k = 0; k != tempIndex; ++k)a[start + k] = temp[k]; }}void MergeSort(int a[], int start, int end, int temp[]){if (start < end){int mid = (start + end) / 2;MergeSort(a, start, mid, temp);MergeSort(a, mid + 1, end, temp);MergeHelp(a, start, mid, end, temp);}}/**********选择排序****************/int findMin(int a[], int start, int len){int i = start, min = a[i];if (len > 0){for (int j = start; j != start + len; ++j)if (a[j] < min){min = a[j];i = j;}return i;}}void SelectSort(int a[], int len){for (int i = 0; i != len; ++i){int minIndex = findMin(a, i, len - i);swap(a[minIndex], a[i]);}}int main(){int a[] = { 0, 3, 4, 2, 5, 1, 8, 4, 2, 19,7 };SelectSort(a, 11);//BuildHeap(a, 11);for (int i = 0; i != 11; ++i)cout << a[i] << endl;system("pause");return 0;}

0 0