您的位置:首页 > 职场人生

黑马程序员——冒泡排序选择排序折半查找思想

2015-11-22 16:20 555 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

第一讲   冒泡排序思想
冒泡排序定义:
        冒泡排序是一种简单的排序方法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺秀错误就把他们交换过来,走访数列的工作是重复地进行知道没有在需要交换,也就是说该数列已经排序完成,这个算法的名字由来是因为越小的元素会经由交换慢慢浮到数列的顶端
       冒泡排序分为:大数下沉,小数上浮
冒泡排序的步骤:
1)比较相邻的两个元素,如果第一个比第二个大,就交换他们的位置
2)对每一个相邻的元素做同样的工作,从开始第一对到结尾最后一对,在这一点,最后的元素应该会是最大的数
3)针对所有的元素重复以上的步骤,除了最后一个
4)持续每次对越来越少的元素重复上面的步骤,知道没有任何一个数字需要比较
如图所示,把几个数用冒泡排序思想排序:







以下是代码实现部分:

void maoPao(int arr[],int len){

int temp;
for(int i=0;i<len-1;i++){                   //外层循环控制需要对比数的个数
for(int j=0;j<len-1-i;j++){             //里层循环控制每个数需要对比的次数
if(arr[j]>arr[j+1]){                //if语句控制比较结果
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main(){

int a[10]={1,200,23,45,12,34,19,4,388,63};
maoPao(a,10)                               //调用函数
for(int i=0;i<10;i++){
printf("%d\t",a[i]);                   //数组遍历输出排序后的值
}

}


第二讲   选择排序思想

概念:
选择排序是一种简单直观的排序方法,它的工作原理是,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中寻找最小元素,然后放到排序序列末尾,以此类推,知道所有元素排序完毕。
选择排序的基本思想:
第一趟排序在所有待排序的N个记录中选出关键字最小的记录,将它与数据表中的第一个记录交换位置,使关键字最小的记录处于数据表的最前端,第二趟在剩下的N-1个记录中在选出关键字最小的记录,将其与数据表中的第二个记录交换位置,使关键字次小的记录处于数据表的第二个位置,重复这样的操作,一次选出数据表中关键字第三小,第四小的元素,将它们分别换到数据表第三,第四个位置上,排序共进行N-1趟,最终可以实现数据表的升序排列
如图所示:



代码实现:

void selectsort(int arr[],int len){

int temp;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(arr[i]>arr[j]){           //交换的依据
temp=arr[i];               //让arr[i]和arr[j]进行交换
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
int main(){

int a[10]={23,4,12,67,21,100,22,45,3,28};
selectsort(a,10);
for(int i=0;i<10;i++){
printf("%d\t",a[i]);             //遍历数组
}
return 0;
}


第三讲   折半查找思想

基本思路:
在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功,若给定的值小于中间元素的要查找的数,则在中间元素的左半区继续查找
若给定的值大于中间元素要查找的数,则在中间元素的右半区继续查找,不断重复上述查找过程,直到查找成功,或所查的区域无数据元素,查找失败。
实现步骤:
1)low=1;high=length; //设置初始区间
2)当low>high时,返回查找失败信息// 表空,查找失败
3)low<=high,mid=(low+high)/2  //取中点
         i.若key<arr[mid],  high=mid-1 转2)//查找在左半区进行
        ii 若key>arr[mid],  low=mid+1 转2)//查找在右半区进行
       iii 若key=arr[mid],  返回数据元素在表中位置//查找成功
如图所示:



代码实现:

int searchItem(int arr[],int len,int key){

int low=0,high=len-1,mid;
while(low<=high){

mid=(low+high)/2;
if(key>arr[mid]){           //若key>arr[mid],  high=mid-1 查找在右半区进行
low=mid+1;
}else if(key<arr[mid]){           //若key<arr[mid],  high=mid-1 查找在左半区进行
high=mid-1;
}else{
return mid;                 //若key=arr[mid],  返回数据元素在表中位置 查找成功
}
}
return -1;
}
int main(){

int a[]={3,4,12,20,35,48,57,59,60,103};
int loc=searchItem(a,10,20);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: