排序算法总结及实现
来源:互联网 发布:湖北师范大学金数据 编辑:程序博客网 时间:2024/06/02 03:35
经典排序算法及其实现
冒泡排序
从后向前遍历,如果当前元素比前一位的元素小,就将其互换,这样一遍下来,最小的元素会被换到第一位,再从后向前进行第二遍遍历。。。
//冒泡void bubbleSort(vector<int>& array) { int size = array.size(); for (int i = 0; i < size; i++) { for (int j = size-1; j > i; j--) { if (array[j] < array[j - 1]){ int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } return;}
选择排序
顾名思义,每次都选择当前剩下元素中最小的一个。
选择最小的元素,存入A[0],再在剩下的元素中,选择第二小的,存入A[1]。。。
//选择void selectSort(vector<int>& array) { int size = array.size(); for (int i = 0; i < size; i++) { int minIndex = i; for (int j = i+1; j < size; j++) { minIndex = array[minIndex] < array[j] ? minIndex : j; } int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } return;}
插入排序
每次都将一个元素插入一个已排好序的数组中。
//插入void insertSort(vector<int>& array) { int size = array.size(); for (int i = 1; i < size; i++) { //若需要插入的元素比数组中所有元素都小,该元素会插在A[0]的位置,即-1之后 int index = -1; int temp = array[i]; //为当前元素在已排好序的数组中找到合适的位置,即插在index之后 //从后向前找,只需要找到第一个小于等于当前元素的index for (int j = i - 1; j >= 0; j--) { if (array[j] <= temp) { index = j; break; } } //将index之后的元素都后移一位 for (int k = i; k > index+1; k--) { array[k] = array[k-1]; } //设置插入的元素 array[index + 1] = temp; } return;}
快速排序
以第一个元素x为界限,将数组分成两个部分,x之前的都比它小,x之后的都比它大,对两部分分别递归地进行快排。
//划分算法,返回A[low]的新位置//in placeint split(vector<int>& array,int low,int high) { int i = low; int x = array[i]; //index=low的元素作为哨兵 //做一次遍历,[low+1,i]的都比x小 for (int j = i+1; j <= high; j++) { if (array[j] <= x) { i++; //找最近一个比x大的元素,交换位置 if (i != j) { int temp = array[j]; array[j] = array[i]; array[i] = temp; } } } //最后需要交换i和low的位置 int temp = array[i]; array[i] = array[low]; array[low] = temp; return i;}//快排void quickSort(vector<int>& array,int low,int high) { if (low < high) { int w = split(array,low,high); quickSort(array, low, w - 1); quickSort(array, w + 1, high); } return;}
归并排序
将数组从中间一分为二,对两部分分别进行排序,再将其合并,排序的方法可以任选,也可以使用归并排序进行递归。
//将数组array[low,mid],array[mid+1,high]合并void merge(vector<int>& array, int low, int mid, int high) { vector<int> result; //辅助数组 int s = low; int t = mid + 1; //两个指针 while (s <= mid && t <= high) { if (array[s] <= array[t]) { result.push_back(array[s]); s++; } else{ result.push_back(array[t]); t++; } } //若array[low,mid]或者array[mid+1,high]有剩余,将剩下的全部复制到result数组中 if (s <= mid) { for (int i = s; i <= mid; i++) { result.push_back(array[i]); } } if (t <= high) { for (int i = t; i <= high; i++) { result.push_back(array[i]); } } //将辅助数组中的值存入原始数组 int k = 0; for (int i = low; i <= high; i++) { array[i] = result[k]; k++; } return;}//归并void mergeSort(vector<int>& array, int low, int high) { if (low < high) { int mid = (low + high) / 2; mergeSort(array, low, mid); mergeSort(array, mid + 1, high); merge(array, low, mid, high); } return;}
完整代码
#include <iostream>#include <vector>using namespace std;//冒泡void bubbleSort(vector<int>& array) { int size = array.size(); for (int i = 0; i < size; i++) { for (int j = size-1; j > i; j--) { if (array[j] < array[j - 1]){ int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } return;}//选择//找到最小的元素,存在A[0]中,再从剩下的里面找到第二小的,存在A[1]中...void selectSort(vector<int>& array) { int size = array.size(); for (int i = 0; i < size; i++) { int minIndex = i; for (int j = i+1; j < size; j++) { minIndex = array[minIndex] < array[j] ? minIndex : j; } int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } return;}//插入//每次将一个元素插入一个已排好序的数组中void insertSort(vector<int>& array) { int size = array.size(); for (int i = 1; i < size; i++) { int index = -1; int temp = array[i]; //为当前元素在已排好序的数组中找到合适的位置,即插在index之后 for (int j = i - 1; j >= 0; j--) { if (array[j] <= temp) { index = j; break; } } //将index之后的元素都后移一位 for (int k = i; k > index+1; k--) { array[k] = array[k-1]; } //设置插入的元素 array[index + 1] = temp; } return;}//将数组分成两部分,比哨兵x小的都在x之前,比x大的都在x之后//in placeint split(vector<int>& array,int low,int high) { int i = low; int x = array[i]; for (int j = i+1; j <= high; j++) { if (array[j] <= x) { i++; if (i != j) { int temp = array[j]; array[j] = array[i]; array[i] = temp; } } } int temp = array[i]; array[i] = array[low]; array[low] = temp; return i;}//快排//将数组split成两部分,对这两部分分别进行递归地快排void quickSort(vector<int>& array,int low,int high) { if (low < high) { int w = split(array,low,high); quickSort(array, low, w - 1); quickSort(array, w + 1, high); } return;}//将数组array[low,mid],array[mid+1,high]合并void merge(vector<int>& array, int low, int mid, int high) { vector<int> result; //辅助数组 int s = low; int t = mid + 1; //两个指针 while (s <= mid && t <= high) { if (array[s] <= array[t]) { result.push_back(array[s]); s++; } else{ result.push_back(array[t]); t++; } } //若array[low,mid]或者array[mid+1,high]有剩余,将剩下的全部复制到result数组中 if (s <= mid) { for (int i = s; i <= mid; i++) { result.push_back(array[i]); } } if (t <= high) { for (int i = t; i <= high; i++) { result.push_back(array[i]); } } //将辅助数组中的值存入原始数组 int k = 0; for (int i = low; i <= high; i++) { array[i] = result[k]; k++; } return;}//归并排序//将数组从中间一分为二,对每个部分分别进行排序,再将排好序的两部分合并,排序方法同样可以使用归并排序进行递归void mergeSort(vector<int>& array, int low, int high) { if (low < high) { int mid = (low + high) / 2; mergeSort(array, low, mid); mergeSort(array, mid + 1, high); merge(array, low, mid, high); } return;}void chooseSortType(int sortType, vector<int>& array) { switch (sortType) { case(1) : cout << "Bubble Sort:" << endl; bubbleSort(array); break; case(2) : cout << "Select Sort:" << endl; selectSort(array); break; case(3) : cout << "Insert Sort:" << endl; insertSort(array); break; case(4) : cout << "Quick Sort:" << endl; quickSort(array, 0, array.size()-1); break; case(5) : cout << "Merge Sort:" << endl; mergeSort(array, 0, array.size() - 1); break; default: break; }}void printArray(vector<int> array){ int size = array.size(); for (int i = 0; i < size; i++) { cout << array[i] << " "; }}int main(){ vector<int> array; array.push_back(6); array.push_back(6); array.push_back(7); array.push_back(2); array.push_back(5); array.push_back(3); array.push_back(4); array.push_back(1); array.push_back(12); array.push_back(8); array.push_back(9); chooseSortType(5,array); printArray(array); return 0;}
0 0
- 排序算法总结及实现
- 各种排序算法实现及总结
- 排序算法总结及java实现
- 各种排序算法java实现及总结
- 基础排序算法总结及实现
- 排序算法总结实现
- 排序算法实现总结
- 排序算法实现总结
- 排序算法及实现
- 总结java实现八大排序算法及之间的关系
- 常见排序算法总结及C语言实现
- 7种排序算法的实现及分析总结
- 各种排序算法总结及C#代码实现
- 八大排序算法总结及C/C++实现
- 各种排序算法总结及C#代码实现
- 排序算法总结及实现(C语言版)
- 数据结构中查找和排序算法总结及源码实现
- 堆排序及各种排序算法总结
- ArrayList、linklist、list的区别
- Instant Run requires 'Tools' | Android | Enable ADB integration' to be enabled
- C++设计模式系列之三行为型模式
- Solr的安装及配置
- c#字符转换
- 排序算法总结及实现
- Android Handler 详解
- app后端设计
- Spring 与 Kafka集成实战
- webservice基本使用方法
- StudyJams-第08课_多语言支持
- JS制作一个跳转提示页面
- 安卓App热补丁动态修复技术介绍
- C++的初始化问题