一.排序算法
1.选择排序
基本思想:每次循环,从所有元素中选出最小的
#include<iostream>//不稳定排序
usingnamespacestd;
inta[] = { 3,5,2,4,6,8,9,7,1 };
intlen=9;
intmain()
{
intk;//标记下标的变量`
for (inti=0;i<len;i++)
{
k=i;//给k赋值
for (intj=i+1;j<len;j++)//从第二个元素开始比较`
{
if (a[k] >a[j])
{
k=j;
}
if (k!=i)
swap(a[i], a[k]);
}
}
for (inti=0;i<len;i++)
{
cout<<a[i] <<" ";
}
}
2.计数排序
#include<iostream>
usingnamespacestd;
intmain()
{
intarr[20];
intnum;
cin>>num;
intscore;
for(inti=1;i<=num;i++)
{
cin>>score;
arr[score]++;//计数
}
for(inti=1;i<=num;i++)
{
while(a[i]>0)
{
cout<<i<<" ";
a[i]--;
}
}
return0;
}//不能排负数
3.插入排序
#include<iostream>//稳定排序
usingnamespacestd;
intmain()
{
inta[15]= {46,35,1,24,29,28,4,46,26,20,3,26,9,18,37};
intn=15;
inti,j;
for(inti=1;i<n;i++)//遍历元素,从第二个开始
{
for(j=i;j>0;j--)//从起始点至最左端
{
if(a[j]<a[j-1])
{
swap(a[j],a[j-1]);
}
else
break;
}
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
}
4.冒泡排序
#include<iostream>
usingnamespacestd;
intmain()
{
inta[8]={36,25,48,12,25,43,20,28};
intn=8;
inti,j,c;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
c=0;
if(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
c=1;//优化,减少运行次数,提前跳出
if(c==0)break;
}
}
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
}//稳定排序,不会改变相同元素的相对位置
5.归并排序
#include<iostream>
usingnamespacestd;
inta[8]={36,25,48,12,25,43,20,28};
intb[8];//全局变量
voidmsort(intl,intr)
{
if(1==r)return;
intmid= (1+r)/2;
msort(1,mid);
msort(mid,r);//递归
inti=1,j=mid+1,k=1;
while(i<=mid&&j<=r)//两段区间,确保两个数字分割在两端
{
if(a[i]<=a[j])
{
b[k]=a[i];//小左
i++;
}
else
{
b[k]=a[j];//大右
j++;
}
k++;//下一个数字
}
while(i<=mid)b[k++]=a[i++];//左侧还有剩下的都比右侧的大,直接拷贝过去
while(j<=r)b[k++]=a[j++];
for(i=1;i<=r;i++)a[i]=b[i];
}
intmain()
{
intn=8;
msort(0,n-1);
for(inti=0;i<n;i++)
cout<<a[i]<<" ";
return0;
}//稳定排序
6.快速排序
#include<iostream>//不稳定排序
usingnamespacestd;
inta[8]={36,25,48,12,25,43,20,28};
voidqsort( intleft,intr)//以最左端元素的值为标准开始比较
{
if(left>r)return;
inti=left,j=r;
intbase=a[left];
while(i<j)
{
while(i<j&&a[j]>=base)j--;//从左侧找一个比标准值大的数
while(i<j&&a[i]<=base)i++;//从右侧找一个比标准值小的数
if(i<j)
swap(a[i],a[j]);//如果找到以后俩数没碰到,交换,同时也退出while
}
swap(a[left],a[i]);//上述过程都做完以后,把找到的那个数换成标准值
qsort(left,j-1);//左端递归
qsort(j+1,r);//右端递归
}
intmain()
{
intn=8;
qsort(0,n-1);
for(inti=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return0;
}