1.排序算法的几大分类
插入排序
交换排序
选择排序
归并排序
2.快速排序
一个无序数组,从左到右依次把每一个值放到合适的位置(在该数组排好序后的位置)
关键是在怎么每次把一个元素放到合适的位置
肯定得递归
代码:
//
// Created by lpz on 2023/9/21.
//
#include "iostream"
using namespace std;
void QuickSort(int* R,int l,int r)
{
int tmp;
int s=l,t=r;
//数组内至少有2个值
if(s<t) {
tmp = *(R + l);
while (s != t) {
while (t > s && *(R + t) >= tmp)
t--;
*(R + s) = *(R + t);
while (s < t && *(R + s) <= tmp)
s++;
*(R + t) = *(R + s);
}
*(R + s) = tmp;
QuickSort(R, l, s - 1);
QuickSort(R, s + 1, r);
}
}
int main()
{
int data[]={6,8,7,9,0,1,3,2,4,5};
QuickSort(data,0,9);
for (int d:data)
cout<<d<<endl;
return 0;
}
3.归并排序
需要三个函数
void Merge(int* R,int l,int m,int r); 将数组中两个相邻的有序子序列归并为一个有序序列
void MergePass(int* R,int length,int n); 将数组从小到大分Length长的段
void MergeSort(int* R,int n); 数组逐步2倍的增加length
代码
//
// Created by lpz on 2023/9/21.
//
#include "iostream"
using namespace std;
void Merge(int* R,int l,int m,int r)
{
int Rt[r-l+1];
int i=l,j=m+1,k=0;
while(i<=m&&j<=r)
{
if(R[i]<=R[j])
{
Rt[k]=R[i];
i++;
}
else
{
Rt[k] = R[j];
j++;
}
k++;
}
if(i<=m)
{
Rt[k]=R[i];
i++;
k++;
}
if(j<=r)
{
Rt[k]=R[j];
j++;
k++;
}
for(int i=l;i<=r;i++)
R[i]=Rt[i-l];
}
void MergePass(int* R,int length,int n)
{
int i;
for(i=0;i+2*length-1<n;i+=2*length)
{
Merge(R,i,i+length-1,i+2*length-1);
}
if(i+length-1<n)
{
Merge(R,i,i+length-1,n-1);
}
}
void MergeSort(int* R,int n){
int len;
for(len=1;len<n;len*=2)
{
MergePass(R,len,n);
for (int i=0;i<n;i++)
cout<<R[i]<<endl;
cout<<"one"<<endl;
}
}
int main()
{
int data[]={18,2,20,34,12,32,6,16,1,5};
MergeSort(data,10);
for (int d:data)
cout<<d<<endl;
return 0;
}