typedef struct
{
vector<int> r{0, 50, 10, 90, 30, 70, 40, 80, 60};
int length = 8;
} SqList;
void swap(SqList &L, int i, int j)
{
int temp = L.r[i];
L.r[i] = L.r[j];
L.r[j] = temp;
}
vector<int> test{0, 1, 19, 5, 13, 8, 18, 3, 7, 4, 6, 2, 10};
/**
* @description: 冒泡递增排序,平均时间复杂度是O(n^2),且算法稳定
* @param {vector<int>&v}
* @return {无}
*/
void BubbleSort(vector<int> &v)
{
bool flag = true;
int temp;
for (int i = 0; i < v.size() && flag; i++)
{
flag = false;
for (int j = 0; j < v.size() - i - 1; j++)
{
if (v[j] > v[j + 1])
{
temp = v[j];
v[j] = v[j + 1];
v[j + 1] = temp;
flag = true;
}
}
}
}
int Partition(SqList &L, int low, int high)
{
L.r[0] = L.r[low];
int pivotkey = L.r[low];
while (low < high)
{
while (low < high && L.r[high] >= pivotkey)
--high;
L.r[low] = L.r[high];
while (low < high && L.r[low] <= pivotkey)
++low;
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QuickSort(SqList &L, int low, int high)
{
int pivot;
if (low < high)
{
pivot = Partition(L, low, high);
QuickSort(L, low, pivot - 1);
QuickSort(L, pivot + 1, high);
}
}
/**
* @description: 简单选择排序,平均时间复杂度是O(n^2),不稳定排序算法
* @param {SqList &L}
* @return {无}
*/
void SelectSort(SqList &L)
{
int k;
for (int i = 1; i < L.length; i++)
{
k = i;
for (int j = i + 1; j <= L.length; j++)
{
if (L.r[j] < L.r[k])
k = j;
}
if (k != i)
{
L.r[0] = L.r[i];
L.r[i] = L.r[k];
L.r[k] = L.r[0];
}
}
}
void HeapAdjust(SqList &L, int s, int m)
{
int temp;
temp = L.r[s];
for (int j = 2 * s; j <= m; j *= 2)
{
if (j < m && L.r[j] < L.r[j + 1])
++j;
if (temp >= L.r[j])
break;
L.r[s] = L.r[j];
s = j;
}
L.r[s] = temp;
}
void HeapSort(SqList &L)
{
for (int i = L.length / 2; i > 0; i--)
{
HeapAdjust(L, i, L.length);
}
for (int i = L.length; i > 1; i--)
{
swap(L, 1, i);
HeapAdjust(L, 1, i - 1);
}
}
/**
* @description: 归并排序,平均时间复杂度是O(nlog2n)
* @param {SqList &}
* @return {无}
*/
1、快速排序程序:
void quickSort(vector<int>&nums,int first,int end){
int left=first;
int right=end;
if(first>=end)return;
int i = rand() % (right- left + 1) + left;
swap(nums[i],nums[left]);
int key=nums[first];
while(first<end){
while(first<end&&nums[end]>=key)
end--;
nums[first]=nums[end];
while(first<end&&nums[first]<=key)
first++;
nums[end]=nums[first];
}
nums[first]=key;
quickSort(nums,left,first-1);
quickSort(nums,first+1,right);
}
2、归并排序
vector<int> sortArray(vector<int>& nums) {
int len=nums.size();
vector<int>tmp(len,0);
mergeSort(nums,tmp,0,len-1);
return nums;
}
void mergeSort(vector<int>&nums,vector<int>&tmp,int low,int high){
if(low>=high)return;
int mid=(high+low)/2;
int start1=low,end1=mid;
int start2=mid+1,end2=high;
mergeSort(nums,tmp,start1,end1);
mergeSort(nums,tmp,start2,end2);
int index=low;
while(start1<=end1&&start2<=end2){
tmp[index++]=nums[start1]<nums[start2]?nums[start1++]:nums[start2++];
}
while(start1<=end1){
tmp[index++]=nums[start1++];
}
while(start2<=end2){
tmp[index++]=nums[start2++];
}
for(int i=low;i<=high;i++){
nums[i]=tmp[i];
}
}
3、堆排序
void heapify_sort(vector<int>&nums,int n){
int tmp=(n-2)/2;
for(int i=tmp;i>=0;i--){
heapify(nums,n,i);
}
for(int i=0;i<n;i++){
swap(nums.front(),nums[n-i-1]);
heapify(nums,n-i-1,0);
}
}
void heapify(vector<int>&nums,int n,int i){
int l=2*i+1,r=2*i+2;
int max=i;
if(l<n&&nums[l]>nums[max])max=l;
if(r<n&&nums[r]>nums[max])max=r;
if(max!=i){
swap(nums[i],nums[max]);
heapify(nums,n,max);
}
}