冒泡排序:
两两比较,较大的往后,较小的往前。
void BubbleSorting(std::vector<int>& testdata)//冒泡排序,从小到大;
{
int nSize = testdata.size();
if(nSize < = 1)
return;
int tmp,nex;
for(int i = 0;i<nSize-1;i++)//遍历size-1遍
{
nex = 0;//设定一个初始的值,为第一个数
for(int j = 1;j<(nSize - i);j++)//完成一遍以后应该保证最大值,放在了最后面;
{
if(testdata[nex] > testdata[j])//如果选定的值大于后面的值,就将选定值于后面的值进行交换
{
tmp = testdata[j]; //交换选定值和比较值
testdata[j] = testdata[nex];
testdata[nex] = tmp;
}
nex = j;//选定值的序号也进行更新
}
}
}
选择排序:
不断地从未排序的部分筛选出最大值和最小值,(可以只筛选一个最值)
void BubbleSorting(std::vector<int>& testdata)
{
int nSize = testdata.size();//获取数组大小
if(nSize <= 1)
return;
int minnex,maxnex,min,max;//定义最大最小值的临时变量,和最大最小值的角标记录变量
for(int i = 0;i <nSize / 2;i++)//循环总大小一半就好,奇数偶数不用考虑
{
min = testdata[i];//最小值初始值从左往右
max = testdata[nSize - 1 -i];//最大值初始值从右往左
for(int j = i; j<nSize -i;j++)//找到最大值和最小值,并记录角标
{
if(min >= testdata[j])
{
min = testdata[j];
maxnex = j;
}
else if(max <= testdata[j])
{
max = testdata[j];
maxnex = j;
}
}
//将最大值和最小值分别与最左侧和最右侧的值进行交换
testdata[minnex] = testdata[i];
testdata[i] = min;
testdata[maxnex] = testdata[nSize -1 -i];
testdata[nSize -1 -i] = max;
}
}
插入排序:从第二个值开始,分别与前面的所有值进行比较,并插入到他应该在的位置上(即保证该值之前的序列排列顺序满足要求)
void InsertSorting(std::vector<int>& testdata)
{
int nSize = testdata.size();//获取数组总大小
if(nSize <= 1)
return;
int tmp;
//使用vector的插入和删除功能
//for(int i =1;i<nSize;i++)
//{
// for(int j = i-1;j >=0;j--)
// {
// if(testdata[i]>testdata[j]) //如果前面的值比该值小
// {
// tmp = testdata[i]; //选定指定值
// testdata.erase(testdata.begin() +i); //销毁指定值
// testdata.insert(testdata.begin() + j + 1,tmp);//插入指定值到小于指定值的后面
// break;
// }
// if(j == 0) //如果已经移动到了最前面,就插入到最前面
// {
// tmp = testdata[i];
// testdata.erase(testdata.begin() +i);
// testdata.insert(testdata.begin() + j,tmp);
// }
// }
//
//}
for(int i = 1; i<nSize;i++)//从第二个遍历到最后
{
if(testdata[i-1]>testdata[i])//如果前一个比选定的值大
{
tmp = testdata[i];//将选定的值记录到缓存
int j = i-1;//将比缓存中大的值,都向后移动一个位置
do{
testdata[j+1] = testdata[j];
j--;
}while(j>=0 && testdata[j]>tmp);
testdata[j+1] = tmp;//将缓存值放入空出来的位置
}
}
}
希尔排序:插入排序的改进版本,首先将原数组平均分为两组,对每组分别进行排序;排序规则为每组再均分为两组,直到分为总共size组,在两两组合,进行插入排序
void ShellSorting(std::vector<int>& testData)
{
int nSize = testdata.size();
if(nSize<=1) return;
int incre = nSize;
int tmp;
do
{
incre = incre / 3 + 1; //初始化划分量
for(int i = incre; i<nSize;i++)
{
if(testdata[i - incre] > testdata[i]) //插入排序
{
tmp = testdata[i];
int j = i- incre;
do{
testdata[ j + incre] = testdata[j];
j -= incre;
}while(j >= 0 &&testdata[j] > tmp);
testdata[j+incre] = tmp;
}
}
}while(incre >1)
//下面算法也是能够取得正确的排序结果,但是方法上面好像有问题
//int incre = i / 3 + 1; //从第二个序列开始,对每组进行插入排序
//for(; incre > 0;incre = incre/3)
//{
//for(int preIndex = k - incre; preIndex >0 && testdata[preIndex + incre] <testdata[preIndex];pre = preIndex - incre)
//{
//tmp = testdata[preIndex + incre];
//testdata[preIndex + incre] = testdata[preIndex];
//testdata[preIndex] = tmp;
//}
//}
}