冒泡排序
void BubbleSort(vector<int> &arr)//冒泡排序
{
int length=arr.size();
for(int i=0;i<length-1;i++)
{
for(int j=i+1;j<length;j++)
{
if(arr[i]>arr[j])//arr[i]<arr[j] 降序
{
swap(arr[i],arr[j]);
}
}
}
show(arr);
}
插入排序
void InsertSort(vector<int> &arr)//直接插入排序
{
int i,j,temp;
for(i=1;i<arr.size();i++)
{
temp=arr[i];
j=i-1;
while(j>=0&&temp<arr[j])//j>=0&&temp>arr[j]降序
{
arr[j+1]=arr[j];//数组向后移动
j--;
}
arr[j+1]=temp;
}
show(arr);
}
选择排序
void SelectSort(vector<int> &arr)//选择排序
{
int i,j,temp,min;//选择极值的排序法
for(i=0;i<arr.size()-1;i++)
{
min=i;
for(j=i+1;j<arr.size();j++)
{
if(arr[j]<arr[min])// arr[j]>arr[min] 降序
{
min=j;
}
}
if(min!=i)
{
temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
show(arr);
}
快速排序
void QuickSortMain(vector<int> &arr,int left,int right)//挖坑法
{
if(left>=right)
return ;
int i=left,j=right,temp=arr[left];//挖起left处的数字
while(i<j)
{
while(arr[j]>=temp&&i<j)j--;//找到右边比temp小的 arr[j]<=temp&&i<j 降序
while(arr[i]<=temp&&i<j)i++;//找到左边比temp大的 arr[i]>=temp&&i<j 降序
if(i<j)//交换
{
swap(arr[i],arr[j]);
}
}
arr[left]=arr[i];//此时i==j,这个时候是temp应该待的位置
arr[i]=temp;
QuickSortMain(arr,left,i-1);//递归
QuickSortMain(arr,i+1,right);
}
void QuickSort(vector<int> &arr)// 快速排序
{
QuickSortMain(arr,0,arr.size()-1);
show(arr);
}
归并排序
void Merge(vector<int> &arr,int left,int mid,int right)//归并逻辑
{
//cout<<left<<" "<<mid<<" "<<right<<endl;
vector<int> temp;
int i=left,k=mid+1;
while(i<=mid&&k<=right)
{
arr[i]<arr[k]?temp.push_back(arr[i++]):temp.push_back(arr[k++]);
//arr[i]>arr[k]?temp.push_back(arr[i++]):temp.push_back(arr[k++])降序
}
while(i<=mid)
{
temp.push_back(arr[i++]);
}
while(k<=right)
{
temp.push_back(arr[k++]);
}
for(int j=left;j<=right;j++)
{
arr[j]=temp[j-left];
}
}
void MergeSortMain(vector<int> &arr,int left,int right)//归并排序,拆成两块排序
{
if(right>left)
{
int mid=(left+right)/2;
MergeSortMain(arr,left,mid);
MergeSortMain(arr,mid+1,right);
Merge(arr,left,mid,right);//归并两块
}
}
希尔排序
void ShellSort(vector<int> &arr)//希尔排序
{
int length=arr.size();
int gap;//步长
for(gap=3;gap>0;gap--)//步长从3到1
{
for(int i=0;i<gap;i++)//步长为3需要执行3次,为2需要执行2次,相当于数组拆分,所以需要执行多次插入排序
{
for(int j=i+gap;j<length;j+=gap)
{
if(arr[j]<arr[j-gap])// arr[j]>arr[j-gap] 降序
{
int temp=arr[j];
int k=j-gap;
while(k>=0&&arr[k]>temp) // arr[k]<temp 降序
{
arr[k+gap]=arr[k];
k-=gap;
}
arr[k+gap]=temp;
}
}
}
}
show(arr);
}
工具函数
void show(vector<int> arr)//显示函数
{
for(int i=0;i<arr.size();i++)
{
cout<<arr[i]<<endl;
}
}
void swap(int &a,int &b)//交换函数
{
int temp;
temp=a;
a=b;
b=temp;
}
vector<int> rand_vc(int n)//生成n个数字的vector
{
vector<int> send_arr;
for(int i=0;i<n;i++)
{
send_arr.push_back(rand()%10000);//10000随机数的大小范围
}
return send_arr;
}