您的位置:首页 > 其它

简单排序

2016-06-17 20:50 155 查看

**********简单排序********

对于语言的学习排序就少了,很常见就是将数据排序,我们知道的排序很多,

例如:冒泡排序、直接排序、选择排序、希尔排序、插入排序、堆排序等。

今天我们就针对我们最经典的冒泡排序,直接排序,选择排序。对于后面的

排序我会一一列举。

-------冒泡排序--------

冒泡排序的基本思想:(以升序排列为例)

相邻的两个数进行比较,将较小的数上浮,大数下沉





int main ()
{
int a[7]={5,2,9,10,3,7,1};
int len = sizeof(a)/sizeof(a[0]);//测数组的长度
int i = 0;
int j = 0;
int tmp=0;  //空瓶子,用于交换数组
for(j = 0;j < len ;j ++)//比较多少趟
{
for(i =0;i < len-j-1 ;i++)//第一次少比较0个;第二次少比较1个;第三次少比较2个....第i次就少比较i次
{                        //每趟的比较
if(a[i] > a[i+1])
{
tmp = a[i];
a[i]=a[i+1];
a[i+1]=tmp;
}

}

}
for(i =0;i < len ; i ++)
{
printf("%d ",a[i]);
}

return 0 ;
}
简单的冒泡排序,
但是,问题来了,当你的一堆数相对比较整齐的时候我们就简化一下代码达到c语言学习的简洁,高效。
优化代码,也就是加个标志,如果一次进去没有做过交换,那我们就不用再继续下一趟的比较,达到了
代码的高效,简洁。

int main ()
{
int a[7]={5,2,9,10,3,7,1};
int len = sizeof(a)/sizeof(a[0]);//测数组的长度
int i = 0;
int j = 0;
int tmp=0;  //空瓶子,用于交换数组
bool flag = true;//一个标志
int count = 0;
for(j = 0;j < len ;j ++)//比较多少趟
{
flag = true;//判断完了,就恢复真
for(i =0;i < len-j-1 ;i++)//第一次少比较0个;第二次少比较1个;第三次少比较2个....第i次就少比较i次
{                        //每趟的比较
if(a[i] > a[i+1])
{
count ++;
tmp = a[i];
a[i]=a[i+1];
a[i+1]=tmp;
flag = false;//交换过了就返回false,标志交换过。
}

}
if(flag)
{
break;
}

}
for(i =0;i < len ; i ++)
{
printf("%d ",a[i]);
}

return 0 ;
}
当你的数相对比较整齐时,就count明显看出来了那个效率

--------交换排序----------

交换排序的基本思想:(以升序排列为例)
<strong>两两数进行比较,将较小的数前去,大数后换</strong>。
</pre><pre name="code" class="html"><img src="http://img.blog.csdn.net/20160617230815390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
*/
int main ()
{
int a[7]={5,2,9,10,3,7,1};
int len = sizeof(a)/sizeof(a[0]);//测数组的长度
int i = 0;
int j = 0;
int tmp=0;  //空瓶子,用于交换数组

for(j = 0;j < len ;j ++)//比较多少趟
{
for(i =j;i < len ;i++)//第一次少比较0个;第二次少比较1个;第三次少比较2个....第i次就少比较i次
{                        //每趟的比较
if(a[j] >a[i])
{
tmp = a[j];
a[j]=a[i];
a[i]=tmp;
}

}
}
for(i =0;i < len ; i ++)
{
printf("%d ",a[i]);
}

return 0 ;
}
----------选择排序------------
选择排序的基本思想:(以升序排列为例)

这次就不用比较交换,只是将小数的下标存起来,到时候就把它放在合适的位置就行。



int main ()
{
int a[7]={5,2,9,10,3,7,1};
int len = sizeof(a)/sizeof(a[0]);//测数组的长度
int i = 0;   //每趟交换的次数
int j = 0;  //比较躺数
int tmp=0;  //空瓶子,用于交换数组
int min_index =0;//记录最小的数的下标
int min = a[0];	//记录最小值
for(j = 0;j < len-1 ;j ++)//比较多少趟
{
min_index =j;//每次比较完以后,就把那个数给释放掉,把下一个数开始作为最小值,最小值下标。
min = a[j];//
for(i =j+1;i < len ;i++)//当你把这个数比较完以后,下次就少一个数,
{                        //j+1:表示:j=0时,最小值从1开始
if(min >a[i])        //           j=1时,最小值从2开始,第一次已经把那个最小值放在1的位置了下次肯定就不比较了从下一项开始
{                    //     ..........
min=a[i];
min_index=i;
}

}
if (j != min_index)//每趟的最小值,就放在这第j趟的开始,在做交换
{
tmp=a[j];
a[j]= a[min_index];
a[min_index] = tmp;
}
}
for(i =0;i < len ; i ++)
{
printf("%d ",a[i]);
}

return 0 ;
}


ok,现在只介绍这三个排序方式,以后会讲很多!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: