对一组无序的数字进行排序,冒泡方法是我们常用的一种方法。它的主要思想是对相临的两个数字进行比较然后选较大(小)的一个起来,另一个沉下去。对N个数字,我们需要进行N-1趟,但是有时候我们根本不需要对每一组数字从头到尾都进行遍历,我们指需对那部分无序的地方排列即可完成任务,这样可以提高算法的质量。
1
对于一个本来就有序的数组,我门只遍历一边,就可以判断出它是有序的,然后结束任务。
for (i = 0; i < 9 && tag ; i++) //tag 这里做一个标志,判断它是否已经有序了
{
tag = 0;
for ( j = 0; j < 10 - i - 1; j++)
{
if (a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
tag = 1;
}
}
}
2
对一组数据前部分有序后部分无序算法
for(i = 0; i <= 8 && k >= 0 ; i++)
{
k = -1;
for(j = k+1; j <= 10-i-1 ; j++ )
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
if (k == -1)
{
k = j + 1;
}
}
}
主要思想:
我们主要是找到第一个交换的地点然后以这个点为起点对它后面的数字排序即可。
3 对一组数据前无序后有序
while(k1 >= 0)
{
k2 = k1;
k1 = -1;
for (i = 0; i < k2 ; i++)
{
if (a[i] > a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
k1 = i;
}
}
}
主要思想:我们找到最后一次交换的点,以该点作为终点,然后从O到该点进行排序。
但对于前无序中间有序后无序的情况,没进一步考虑,呵。
如果有那里不足,希望大家给个意见,谢谢。
有时间在签