堆排序
#include<iostream>
#include<vector>
using namespace std;
void adjust(vector<int>& v,int i,int index)
{
int left = 2 * i + 1;
int right = 2 * i + 2;
int maxid = i;
if (left <= index && v[left] > v[maxid]) maxid = left;
if (right <= index && v[right] > v[maxid]) maxid = right;
if (maxid != i)
{
swap(v[maxid],v[i]);
adjust(v,maxid,index);
}
}
void heapSort(vector<int>& v,int index)
{
for (int i=index/2;i>=0;i--)
{
adjust(v,i,index);
}
for (int i=index;i>=1;i--)
{
swap(v[0],v[i]);
adjust(v,0,i-1);
}
}
int main()
{
vector<int> v = {2,3,1,4,5,7,6};
int index = v.size() - 1;
heapSort(v, index);
for (auto e:v)
{
cout << e << endl;
}
}
快速排序
#include<iostream>
#include<vector>
using namespace std;
void quickSort(vector<int>& n,int left,int right)
{
if (left >=right) return;
int l = left;
int r = right;
int key = n[left];
while (l<r)
{
while (n[r] >= key && l < r) r--;
while (n[l] <= key && l < r) l++;
if (l < r)
{
int temp = n[r];
n[r] = n[l];
n[l] = temp;
}
}
n[left] = n[l];
n[l] = key;
quickSort(n, left, l - 1);
quickSort(n, l + 1, right);
}
int main()
{
vector<int> nums = {2,4,3,1,5,6};
quickSort(nums, 0, nums.size() - 1);
for (auto e:nums)
{
cout << e << endl;
}
}
归并排序
#include<iostream>
#include<vector>
using namespace std;
void merge(vector<int>& v,int l,int mid,int r)
{
int n = r - l + 1;
vector<int> temp(n);
int k = 0;
int i = l;
int j = mid + 1;
while (i <= mid && j <= r) temp[k++] = v[i] <= v[j] ? v[i++] : v[j++];
while (i <= mid) temp[k++] = v[i++];
while (j <= r) temp[k++] = v[j++];
for (int i=0;i<n;i++)
{
v[l+i] = temp[i];
}
}
void mergeSort(vector<int> &v,int l,int r)
{
if (l == r) return;
int mid = (l + r) / 2;
mergeSort(v, l, mid);
mergeSort(v,mid+1,r);
merge(v,l,mid,r);
}
int main()
{
vector<int> v = {2,4,3,1,5,7,6};
int n = v.size();
mergeSort(v,0,n-1);
for (auto e:v)
{
cout << e << endl;
}
}