对排序的总结&&二分查找
2014-08-04 23:49
253 查看
排序:是将一个数据元素的任意序列,重新排列成一个按照关键字的序列。
通常在排序的过程中需要进行两种基本操作:
1、比较两个关键字的大小;
2、将一个关键字从一个位置移动到另一个位置。
排序的方法有很多种,每一种方法都有其各自的优缺点,分别适合于不同的环境下使用,对于内部排序大致可以分为插入排序,
交换排序、选择排序,归并排序等排序方法。
下面我介绍几种比较常用的特别是在我们找工作面试中经常会问到的几种排序方法:
一. 冒泡排序
冒泡排序的思想比较简单:先将n个元素中的第一个和第二个比较,如果两个元素的位置为逆序,那么就交换两个个元素的位置;然后比较第二个和第三个元素关键字,如此类推,直到比较第n-1个元素和第n个元素为止;
下面是冒泡排序的代码形式:
1、空间效率:仅使用一个辅存单元。
2、时间效率:如果元素的个数为n,则总共要进行n-1趟排序,对j个元素的字序列进行一趟冒泡排序需要进行j-1次关键字比较。
二、选择排序
选择排序的思想:第一趟,在n个元素用第一个位置上的元素与其余n-1个元素进行比较,如果逆序则交换位置, 则第一个角标上的元素就确定好了;
第二趟,第二个位置的元素再与其余的元素比较,如果逆序则交换元素的位置,则第二个位置 上的元素就确定好了,以此类推,直到整个序列有序。
下面是选择排序的代码形式:
1、空间效率:选择排序也只需要一个辅助空间。
2、选择排序移动的次数相对较少,在序列基本有序的情况下基本不需要移动次数,所以选择排序的大 量时间是用在了比较上了。
三、二分法查找
二分查找也叫折半查找,此方法需要带查找的表必须是有序的;
二分查找的基本思想:首先将查找表中间位置数据元素的关键字与给定关键字比较,如果相等则查找成功;否则 利用中间元素将表一分为二,如果中间元素关键字大于给定关键字,则在前一子表中进行 折半查找,否则在后一子表中进行折半查找,重复上述动作直到查找成功。到最后如果子
表为空则查找不成功。
下面是二分查找的代码形式:
通常在排序的过程中需要进行两种基本操作:
1、比较两个关键字的大小;
2、将一个关键字从一个位置移动到另一个位置。
排序的方法有很多种,每一种方法都有其各自的优缺点,分别适合于不同的环境下使用,对于内部排序大致可以分为插入排序,
交换排序、选择排序,归并排序等排序方法。
下面我介绍几种比较常用的特别是在我们找工作面试中经常会问到的几种排序方法:
一. 冒泡排序
冒泡排序的思想比较简单:先将n个元素中的第一个和第二个比较,如果两个元素的位置为逆序,那么就交换两个个元素的位置;然后比较第二个和第三个元素关键字,如此类推,直到比较第n-1个元素和第n个元素为止;
下面是冒泡排序的代码形式:
<span style="white-space:pre"> </span>//冒泡排序
<span style="white-space:pre"> </span>int[] arr = new int[]{5,78,2,6,34,213,4}; for(int j=0;j<arr.length-1;j++){<span style="white-space:pre"> </span>//比较的轮数 for(int i=0;i<arr.length-1-j;i++){ if(arr[i]>arr[i+1]){<span style="white-space:pre"> </span> //<span style="font-size:18px;">如果两个元素的位置为逆序,那么就交换两个元素的位置</span> int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } System.out.print(arr[i]+" "); } }效率的分析:
1、空间效率:仅使用一个辅存单元。
2、时间效率:如果元素的个数为n,则总共要进行n-1趟排序,对j个元素的字序列进行一趟冒泡排序需要进行j-1次关键字比较。
二、选择排序
选择排序的思想:第一趟,在n个元素用第一个位置上的元素与其余n-1个元素进行比较,如果逆序则交换位置, 则第一个角标上的元素就确定好了;
第二趟,第二个位置的元素再与其余的元素比较,如果逆序则交换元素的位置,则第二个位置 上的元素就确定好了,以此类推,直到整个序列有序。
下面是选择排序的代码形式:
<span style="white-space:pre"> </span>for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i] > arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } }效率的分析:
1、空间效率:选择排序也只需要一个辅助空间。
2、选择排序移动的次数相对较少,在序列基本有序的情况下基本不需要移动次数,所以选择排序的大 量时间是用在了比较上了。
三、二分法查找
二分查找也叫折半查找,此方法需要带查找的表必须是有序的;
二分查找的基本思想:首先将查找表中间位置数据元素的关键字与给定关键字比较,如果相等则查找成功;否则 利用中间元素将表一分为二,如果中间元素关键字大于给定关键字,则在前一子表中进行 折半查找,否则在后一子表中进行折半查找,重复上述动作直到查找成功。到最后如果子
表为空则查找不成功。
下面是二分查找的代码形式:
for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+","); } int minIndex = 0; int maxIndex = arr.length-1; int midIndex = (minIndex+maxIndex)/2; int number = 100; while(arr[midIndex]!=number){ if(number<arr[midIndex]){ maxIndex = midIndex-1; }else if(number>arr[midIndex]){ minIndex = midIndex+1; } if(minIndex>maxIndex){ midIndex = -1; break; } midIndex = (minIndex+maxIndex)/2; } System.out.println(); System.out.println(midIndex);二分查找:适用于不经常变动而查找频繁的有序表。
相关文章推荐
- #1133 : 二分·二分查找之k小数 ( 快速排序, 分治 OR nth_element() 函数)
- 查找(二):二分查找----<学习总结>
- #1128 : 二分·二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )
- 不光是查找值!"二分搜索"总结
- #1133 : 二分·二分查找之k小数(优先队列或SBT或排序)
- [bzoj3343]&&[洛谷2810] [分块][块内排序][二分查找]教主的魔法
- 【Java版本】二分查找&数字在排序数组中出现的次数
- 二分查找求函数的区间最小值&&http://acm.hdu.edu.cn/showproblem.php?pid=2899
- List<T>采用delegate快速实现排序、查找等操作
- practical of programming 第二章 排序和二分查找
- 二分查找总结
- 二分查找函数bsearch与排序函数qsort(两个好基友)
- 《算法导论》学习总结 — 8.第八章(2) 计数排序 && 基数排序 && 桶排序
- [Algorithms] 分治算法(二分查找, 合并排序, 插入排序, 快速排序(coming))
- 二分查找binsearch: 在v[0]&lt;=v[1]&lt;=v[2]&lt;=......&lt;=v[n-1]中查找x,数组v的元素必须以升序排列
- 关于查找排序的一点总结
- 编程珠玑第2章:排序、二分查找、签名、向量平移
- [整理]插入排序以及二分查找排序
- 冒泡排序,插入排序,二分查找
- 快速排序和二分查找的练习