冒泡排序(bubblesort)
N个数只要进行N-1次排序
#include<iostream>
using namespace std;
//升序
int main()
{
int a[6]={5,6,4,2,1,3};
for(int i=0;i<5;i++) //i 表示外层循环次数;
{
for(int j=0;j<6-1-i;j++) //j 表示内层循环次数;
{
if(a[j]<a[j+1]) swap(a[j],a[j+1]);
}
}
for(int i=0;i<6;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
插入排序(insertionsort)
将要排序的数组数据分成两部分,已排序部分和未排序部分;
思路:
1.将开头第一个元素作为已排序元素
2.
++1.取出未排序部分的开头元素赋给变量V;
++2.在已排序部分,将所有比V大的元素向后移动一个位置。
++3.将取出的元素V插入空位。
#include<iostream>
using namespace std;
int main()
{
int a[6]={5,6,4,2,1,3};
int i,j,v;// i 表示未排序的开头元素;j 已排序部分寻找V的插入位置; V 保持a[i]的变量。
for(i=1;i<6;i++)
{
v=a[i];
j=i-1;
while(a[j]>v && j>=0) //注意理清while条件
{
a[j+1]=a[j];
j--;
}
a[j+1]=v; //也可以放在while内的j--;后面;
}
for(int i=0;i<6;i++)
{
if(i>0) cout<<" ";
cout<<a[i];
}
return 0;
}
选择排序(selectionsort)
将要排序的N个数据分成已排序和未排序部分;
思路:
一共要重复 N-1 次如下操作(N表示要排序的数据量)
1.找出未排序部分的最小值的位置;
2.将 minj 位置的元素与未排序部分的起始元素(即,已排序部分的最后一个元素)交换。
#include<iostream>
using namespace std;
int main()
{
int a[6]={5,6,4,2,1,3};
int minj=0;
for(int i=0;i<6-1;i++) // i 表示未排序部分的开头元素;
{
minj=i; // minj 各轮循环中第 i 号到第 N-1 号元素中最小值的位置;
for(int j=i;j<6;j++) //每轮循环中,用来寻找最小值的位置;
{
if(a[j]<a[minj]) minj=j;
}
swap(a[i],a[minj]);
}
for(int i=0;i<6;i++)
{
if(i>0) cout<<" ";
cout<<a[i];
}
return 0;
}
希尔排序(shellsort)
算法思想的出发点:
1.插入排序在基本有序时,效率较高;
2.在未排序的数据量越小,效率越高;
基本思想:
先将整个待排序的数组数据分割成若干个子序列(子序列的划分并不是逐段分割,而是将相隔每个增量的数据分成一组),分别对子序列进行插入排序,改变确定子序列的增量,再进行插入排序,最后的增量一定要为 1 以便对整个基本有序的数据数组进行一次全体的插入排序。
一般而言增量先取数据大小的一半;之后再取1/4,1/8,…
#include<iostream>
using namespace std;
int main()
{
int a[10]={5,9,6,7,3,2,4,1,8,10};
int i,j,v;
for(int di=10/2;di>0;di/=2)
{
for(int i=di;i<10;i++) //以下部分是插入排序的核心代码,只是将数组间的间隔变为增量 di,而要实现 di 的变化,需要外加一层循环;
{
v=a[i]; //注意v=a【i】
j=i-di;
while(j>=0 && a[j]>v)
{
a[j+di]=a[j];
j-=di;
}
a[j+di]=v;
}
}
for(int i=0;i<10;i++)
{
if(i>0) cout<<" ";
cout<<a[i];
}
cout<<endl;
return 0;
}