c++排序算法
Posted o-v-o
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++排序算法相关的知识,希望对你有一定的参考价值。
#include <vector>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
// 冒泡排序
vector<int> bubbleSort(vector<int> arr)
int len = arr.size();
int temp;
for(int i=0; i<len-1; i++)
for(int j=0; j<len-i-1; j++)
if(arr[j]>arr[j+1])
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
return arr;
// 选择排序
vector<int> selectSort(vector<int> arr)
int len = arr.size();
int minIndex, temp;
for(int i=0; i<len-1; i++)
minIndex = i;
for(int j=i+1; j<len; j++) // 找到最小值下标
if(arr[j]<arr[minIndex])
minIndex = j;
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
return arr;
// 插入排序
vector<int> insertionSort(vector<int> arr)
int len = arr.size();
int preIndex, current;
for(int i=1; i<len; i++)
preIndex = i-1;
current = arr[i];
while(preIndex>=0 && arr[preIndex]>current)
arr[preIndex+1] = arr[preIndex];
preIndex--;
arr[preIndex+1] = current;
return arr;
// 希尔排序
vector<int> shellSort(vector<int> arr)
int len = arr.size();
for(int gap=floor(len/2); gap>0; gap=floor(gap/2))
for(int i=gap; i<len; i++)
int j=i; //当前要插入的序列
int current = arr[i];
while(j-gap >= 0 && current<arr[j-gap])
arr[j]=arr[j-gap];
j=j-gap;
arr[j]=current;
return arr;
// 归并排序
#include<iostream>
using namespace std;
void merge(int arr[], int L, int M, int R)
// L是最左边序号,R是最右边序号,M是中间序号的后一位
int LEFT_SIZE = M-L;
int RIGHT_SIZE = R-M+1;
int left[LEFT_SIZE];
int right[RIGHT_SIZE];
int i, j, k;
// 1. fill in the left sub array
for(i=L; i<M; i++)
left[i-L] = arr[i];
// 2. fill in the right sub array
for(i=M; i<=R; i++)
right[i-M] = arr[i];
// for(auto j:left)
// cout <<"left " << j << endl;
//
// for(auto k:right)
// cout << "right " << k << endl;
//
// 3.merge into the original array
i=0; j=0; k=L;
while(i<LEFT_SIZE && j<RIGHT_SIZE)
if(left[i] < right[j])
arr[k] = left[i];
i++;
k++;
else
arr[k] = right[j];
j++;
k++;
while(i<LEFT_SIZE)
arr[k] = left[i];
i++;
k++;
while(j<RIGHT_SIZE)
arr[k] = right[j];
j++;
k++;
void mergeSort(int arr[], int L, int R)
if(L==R) return; // L==R表示数组只有一位数字
int M=(L+R)/2;
mergeSort(arr, L, M);
mergeSort(arr, M+1, R);
merge(arr, L, M+1, R);
// 快排
#include <iostream>
using namespace std;
int partition(int a[], int low, int high)
// i指向第一个大于pivot的值
// j指向小于等于pivot的值,如果j<pivot则开始交换
// 如果i没有找到这个值,i和j指向同一个值
int pivot=a[high];
int i=low;
for(int j=low; j<high; ++j)
// j指向当前遍历元素,如果大于等于pivot,继续向前
// 如果小于pivot,则和i指向的元素交换
if(a[j]<pivot)
swap(a[j], a[i]);
i++;
swap(a[i], a[high]); // 交换到中间
return i; // 返回的是一个分区
void quickSort(int a[], int low, int high)
if(low<high)
int q = partition(a, low, high);
quickSort(a, low, q-1);
quickSort(a, q+1, high);
int main()
// vector<int> a = 2, 3, 5, 1, 9, 7, 4;
// vector<int> b = 10, 8, 6;
// auto res = mergeSort(a);
// for (auto i:res)
// cout << i << endl;
//
// int arr[] = 7, 8, 9, 10, 4, 5, 6, 2;
// int L=0;
// int R=7;
// int M=4;
// int i;
// mergeSort(arr, L, R);
// for(i=0; i<R; i++)
// cout << arr[i] << endl;
//
int a[8] = 3, 1, 2, 4, 5, 8, 7, 6;
quickSort(a, 0, 7);
for(auto i:a)
cout << i << endl;
return 0;
以上是关于c++排序算法的主要内容,如果未能解决你的问题,请参考以下文章