排序算法汇总

一.排序算法


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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值