//冒泡排序
for (i=0;i<len-1;i++) //排序的趟数
{
for (j=0;j<len-1-i;j++) //len-1-i每次排序后,右边都固定了当前最值
{
if (arr[j]>=arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
思想:以升序为例,通过每两个相邻的元素比较大小,数值大的换到右边的方式,将数组中最大的值移至数组最右边,然后将其固定,再从第一个元素开始寻找第二大的值,同样进行移动,以此类推。每次排序都将剩余的元素中的最大值冒泡。
//双向冒泡排序
int start=0,tail=len-1;
while (start<=tail) //如果还有元素没确定其位置
{
for (i=start;i<tail;i++)
{
if (arr[i]>arr[i+1])
{
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
tail--; //向右冒泡一次
for (i=tail;i>start;i--)
{
if (arr[i]<=arr[i-1])
{
temp=arr[i];
arr[i]=arr[i-1];
arr[i-1]=temp;
}
}
start++; //向左冒泡一次
}
思想:原理同冒泡排序一样,但是双向进行的,即最大值向右冒泡,最小值向左冒泡,两边同时进行,算法复杂度也为(n^2),但优于单向冒泡。
//直接插入排序
for (i=1;i<len;i++) //第一个元素是子集合
{
temp=arr[i]; //存储即将插入的元素
j=i-1; // j为该元素前一个元素(前面为已排序的元素)则的下标
while (j>=0&&temp<arr[j]) //如果比前一个元素小
{
arr[j+1]=arr[j];//右移
j--; //继续与左边元素比较
}
arr[j+1]=temp; //直到找到合适的位置
}
思路:顺序地将数值插入已排序好的子集里,子集元素初始为1,后渐渐插入元素,将元素放到合适位置,子集仍然保持升序,直到子集和数组元素个数相同时结束排序。