冒泡排序和js选择排序和冒泡排序的效率问题

&>&&>&&>&&>&各种排序效率比较程序(冒泡,选择,插入,快速,堆,归并,基数,希尔)
各种排序效率比较程序(冒泡,选择,插入,快速,堆,归并,基数,希尔)
上传大小:10KB
冒泡排序,选择排序,直接插入排序,希尔排序,快速排序,堆排序,归并排序
,基数排序。可直接运行的控制台程序
综合评分:4.3(3位用户评分)
所需积分:5
下载次数:10
审核通过送C币
创建者:fireblue1990
创建者:ljheee
课程推荐相关知识库
上传者其他资源上传者专辑
课程资源热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:74
可兑换下载积分:148
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
各种排序效率比较程序(冒泡,选择,插入,快速,堆,归并,基数,希尔)
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
individualing
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:七种排序算法的实现 - 简书
七种排序算法的实现
最近在找工作时很多面试官都会问到排序算法的实现,所以趁着周末有时间就来总结一下七种排序算法实现。算法的实现我使用的是java语言,其中为了增强算法的可复用性,我使用了泛型这一特性,在排序的数组元素都要实现Comparable接口,在排序时使用Comparable接口中的方法compareTo来对两个元素进行比较。
一、冒泡排序。
在当初大一时候学习C语言,当时教的两种排序算法冒泡排序、简单选择排序印象都很深刻,应该是我学过的排序算法中最简单的了。
冒泡排序的思想:
1.第一次排序时将序列[0 ~ n - 1]中从前往后进行两个相邻元素的比较,若前者较大则交换,比较n-1次; 当第一趟排序结束时,序列最大的元素就被交换到位置n-1上,就如同一个气泡,一步一步往后翻滚,直到最后一位。
2.重复步骤1,在第i趟时需要翻滚n-i-1次,每趟决定一个元素的位置,一共需要n-1趟。
比如,初始序列: [1, 5, 4, 3, 2]
第1趟: [1, 4, 3, 2 ] 5
第2趟: [1, 3, 2 ] 4, 5
public static &T extends Comparable&T&& void bubbleSort(T[] a) {
for (int i = 0; i & a.length - 1; i++) {
for (int j = 0; j & a.length - i - 1; j++) {
if (a[j].compareTo(a[j + 1]) & 0) {
T temp = a[j];
a[j] = a[j + 1];
a[j + 1] =
其实优化的冒泡排序应该有第3步,就是在一趟排序中未交换元素则说明子序列已经有序,不在进行下一趟排序;所以冒泡排序最多执行n-1次。
比如,初始序列:[1, 2, 3, 5, 4]
只需要一趟排序:[1, 2, 3, 4 ] 5
下面这个是我实现的优化冒泡算法,因为多了赋值语句和条件判断,所以在数组前面序列有序的情况下运行时间会有优化,但是如果数组元素分布均匀,大小随机则反而效率会低下。
public static &T extends Comparable&T&& void bubbleSortOpt(T[] a) {
for (int i = 0; i & a. i++) {
boolean isSwap =
for (int j = 0; j & a.length - i - 1; j++) {
if (a[j].compareTo(a[j + 1]) & 0) {
T temp = a[j];
a[j] = a[j + 1];
a[j + 1] =
i = isSwap ? i : a.
而下面这个是在我的数据结构课本上的实现,不使用条件判断跳出循环,解决了效率问题。经过多次测试,下面的排序算法的运行时间确实比上面两个要好。
public static &T extends Comparable&T&& void bubbleSortOpti(T[] a) {
int i = a.length - 1, j,
while (i & 0) {
for (j = 0; j & j++) {
if (a[j].compareTo(a[j + 1]) & 0) {
T temp = a[j];
a[j] = a[j + 1];
a[j + 1] =
优化冒泡排序在已经有序的情况下只需进行一趟排序,n-1次比较。因此最好情况下的时间复杂度为O(n),无需移动元素;
最坏情况进行n-1趟排序,第i趟比较n-i次,移动元素3(n-i)次,这样总的比较次数为(1/2)n(n-1),移动元素次数为3n(n-1)/2。最坏情况下时间复杂度为O(n^2)。
二、简单选择排序。
简单选择排序的基本思想:
1.第一趟在初始序列[0 ~ n-1]中找最小值元素,并与位置为0的元素交换位置。
2.第i趟在序列[i-1, n-1]中进行,找到最小值元素与位置为i-1的元素交换位置。每次决定一个元素的位置,经过n-1趟后使得初始序列有序。
比如,初始序列:[1, 5, 4, 3, 2]
第1趟:1 [5, 4, 3, 2]
第2趟:1 2 [4, 3, 5]
public static &T extends Comparable&T&& void selectSort(T[] a) {
for (int i = 0; i & a.length - 1; i++) {
for (int j = i + 1; j & a. j++) {
if (a[k].compareTo(a[j]) & 0) {
if (k & i) {
T temp = a[i];
a[i] = a[k];
上面这种方法是标记了最小元素的位置,在一趟排序的最后交换序列首元素和序列最小元素。之前我还写过一种,在写这篇博客之前我一直以为是冒泡排序,后来才发现是选择排序。我贴出来对比一下,这种写法也是每次确定最小元素的位置但是没有标记而是在一趟排序时进行多次交换元素,这样做影响了效率不推荐这样做。
public static &T extends Comparable&T&& void selectSortE(T[] a) {
for (int i = 0; i & a.length - 1; i++) {
for (int j = i + 1; j & a. j++) {
if (a[i].compareTo(a[j]) & 0) {
T temp = a[i];
a[i] = a[j];
简单选择排序和数组序列的初始排列无关,无聊排列如何都必须要执行n-1趟。总的比较次数为n(n-1)/2,交换元素(n-1)次,移动元素3(n-1)次。最好、最坏和平均时间复杂度都为O(n^2)。
三、直接插入排序
直接插入排序的基本思想:
1.向数组序列后面检索,当检索到后一个元素小于前一个元素时,记录下元素。从记录的元素位置开始往前检索,同时元素往后移找到比记录下元素要小的元素的位置插入。
2.重复1的步骤,经过n-1趟排序后即成为有序序列。
比如,初始序列:[1, 5, 4, 3, 2]
第1趟:[1, (4, 5), 3, 2]
第2趟:[1, (3, 4, 5), 2]
第3趟:[1, (2, 3, 4, 5)]
public static &T extends Comparable&T&& void insertSort(T[] a) {
for (int i = 1; i & a. i++) {
T temp = a[i];
for (; j & 0 && pareTo(a[j - 1]) & 0; j--) {
a[j] = a[j - 1];
直接插叙排序在有序的情况下,总的比较次数是n-1,移动元素次数是2(n-1),最好情况下时间复杂度就是O(n)。最坏情况下,一趟最多比较i次,移动元素i+2次,总的比较次数为n(n-1)/2,移动元素次数(n+4)(n-1)/2。最坏情况时间复杂度为O(n^2)。
四、快速排序。
快速排序可以说是冒泡排序的高级版本,冒泡排序每次都只能对相邻的两个数进行比较,而快速排序从两端同时检索保证每趟排序结束,基准数左边的元素都小于基准数,基准数右边的元素都大于基准数。代码中是选中序列第一个元素作为基准,对快排来说还有很多优化的方法,下次有时间的时候再总结一下。
快速排序的思想:
1.先从序列后端往前检索,找到小于基准数的元素,再从序列前端往后检索,找到大于基准数的数交换两个元素位置。直到从后往前和从前往后的指针相遇,
将基准数的位置和相遇位置元素交换结束一趟排序。这样就划分出两个序列,一个序列的元素比基准数都要小,一个序列的元素比基准数都要大。
2.将划分出的子序列按1的步骤继续排序,直到子序列只有一个元素时得到有序序列。
比如,初始序列:[1, 5, 4, 3, 6, 2]
第1趟:[1, (5, 4, 3, 6, 2)]
第2趟:[1, (2, 4, 3), 5, (6)]
第3趟:[1, 2, (4, 3), 5, 6]
第4趟:[1, 2, 3, 4, 5, 6]
public static &T extends Comparable&T&& void quickSort(T[] a) {
quickSort(a, 0, a.length - 1);
public static &T extends Comparable&T&& void quickSort(T[] a, int left, int right) {
if (left &= right)
T temp = a[left];
while (i & j) {
while(a[j].compareTo(temp) &= 0 && i & j) j--;
while(a[i].compareTo(temp) &= 0 && i & j) i++;
if (i & j) {
T t = a[i];
a[i] = a[j];
a[left] = a[j];
quickSort(a, left, j - 1);
quickSort(a, j + 1, right);
快排最坏情况是每次分割的两个子序列中有一个为空,机初始序列有序(顺序或逆序),这是快速排序效率最低,时间复杂度为O(n^2)。快排的平均时间复杂度为O(nlogn)。在最坏情况下快排需要的附加堆栈存储空间为O(n)。
五、堆排序。
使用数据结构堆来辅助我们排序,如果要构造非递减序列我们采用大根堆。大根堆是包含n个结点的完全二叉树,该树中每个节点的关键字值小于等于其双亲节点的关键字值。
堆排序的思想:
1.将初始序列构造成大根堆,从堆中第一个非叶子节点开始调用adjustDown方法将元素向下调整,直到堆顶。
2.第i趟排序将堆顶元素a[0]与堆底元素a[n-i]交换,然后将a[0]向下调整,直到堆中只剩最后一个元素。
比如,初始序列:[1, 5, 4, 3, 2]
建堆后:[5, 3, 4, 1, 2]
第1趟:[4, 3, 1, 2] 5
第2趟:[3, 1, 2] 4, 5
第3趟:[1, 2] 3, 4, 5
public static &T extends Comparable&T&& void heapSort(T[] a) {
for (int i = (a.length - 2) / 2; i &= 0; i--) {
adjustDown(a, i, a.length - 1);
for (int i = a.length - 1; i &= 0; i--) {
T temp = a[0];
a[0] = a[i];
adjustDown(a, 0, i - 1);
public static &T extends Comparable&T&& void adjustDown(T[] a, int r, int j) {
T temp = a[r];
int child = 2 * r + 1;
while (child &= j) {
if (child & j && a[child].compareTo(a[child + 1]) & 0) child++;
if (pareTo(a[child]) &= 0)
a[(child - 1) / 2] = a[child];
child = 2 * child + 1;
a[(child - 1) / 2] =
构建堆得时间最多是O(nlogn),在每趟排序后都要向下调整一次最多花费O(nlogn),所以堆排序的时间复杂度为O(nlogn)。
六、希尔排序。
据百度百科,希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
希尔排序的思想:
1.第1趟以数组长度的一般作为分量d,后面的步骤与直接插入排序基本一样,只是循环移动的步长为d。
2.在一趟排序之后将增量除以2,继续执行插入排序,直到d为1。
比如,初始序列:[1, 5, 4, 3, 2]
第1趟:[1, 3, 4, 5, 2] d=2
第2趟:[1, 3, 2, 5, 4]
第3趟:[1, 2, 3, 5, 4] d=1
第4趟:[1, 2, 3, 4, 5]
public static &T extends Comparable&T&& void shellSort(T[] a) {
int d = a.length / 2;
while (d &= 1) {
for (int i = i & a. i++) {
T temp = a[i];
for (; j - d &= 0 && pareTo(a[j - d]) & 0; j -= d) {
a[j] = a[j - d];
据百度百科,希尔排序的时间性能优于直接排序的原因:
当文件初态基本有序时,直接插入排序所需的比较和移动次数均较少。
当n值较小时,n和n^2差别也小,即直接插入排序的最好时间复杂和最坏时间复杂度O(n^2)差别不大。
在希尔排序开始时增量较大,分组较多,每组记录数目少,故组内直接插入较快后来增量减少,而组内的记录数目逐渐增多,但由于已经按2d最为距离排过序,使文件较接近于有序状态,所以一趟排序过程也快。
希尔排序的平均时间复杂度为O(n^1.3)。
七、归并排序。
归并排序思想:
将有n个元素的序列看成是n个长度为1的有序子序列,然后两两合并子序列,得到[n/2]个长度为2或1的有序子序列;在两两合并,知道得到一个长度为n的有序序列时结束。
比如,初始序列:[1, 5, 4, 3, 2]
第1趟:[(1, 5), 4, (2, 3)]
第2趟:[(1, 4, 5), (2, 3)]
第3趟:[1, 2, 3, 4, 5]
public static &T extends Comparable&T&& void mergeSort(T[] a) {
mergeSort(a, 0, a.length - 1);
public static &T extends Comparable&T&& void mergeSort(T[] a, int left, int right) {
if (left &= right)
int mid = (left + right) / 2;
mergeSort(a, left, mid);
mergeSort(a, mid + 1, right);
merge(a, left, right, mid);
public static &T extends Comparable&T&& void merge(T[] a, int left, int right, int mid) {
Object[] temp = new Object[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i &= mid && j &= right) {
if (a[i].compareTo(a[j]) &= 0) {
temp[k++] = a[i++];
temp[k++] = a[j++];
while (i &= mid) temp[k++] = a[i++];
while (j &= right) temp[k++] = a[j++];
for (i = 0; i & temp. i++) {
a[left + i] = (T) temp[i];
两路合并算法的时间复杂度为o(nlogn),附加辅助空间为O(n)。
平均时间复杂度
最好情况时间复杂度
最坏情况时间复杂度
最坏空间复杂度
简单选择排序
直接插入排序
最近开了一个个人博客网站,但是不懂怎么用wordpress=。=欢迎前来提意见1499人阅读
C基础(8)
三个排序算法,以时间为计算单位,对比它们的使用效率;为了准确对比,都使用了相同的数组;但是由于每次产生的随机数组都不同,导致排序遍历与交换的次数也不同;所以这里仅针对每一次的结果的对比,具体一定的随机性,但总的来说还是会趋近每个算法自身的时间复杂度。
其中的一个结果如下
&selectSort: ============
bubbleSort:=============
&&insertSort:==========
each sort used time: & &12 & & &13 & & &10
代码如下:#include&stdio.h&
#include&stdlib.h&
#include&time.h&
#define NUMBER 10000
double selectionSort(int [],int);
double bubbleSort(int [],int);
double quickSort(int [],int,int);
double insertSort(int [],int);
void showChart(int [],int);
void display(int [],int);
int main()
int num[NUMBER];
int num0[NUMBER];
int num1[NUMBER];
int num2[NUMBER];
int num3[NUMBER];
int timeList[3];
int randValue = 0;
srand(time(NULL));
for(i=0;i&NUMBER;i++)
randValue=1+(int)rand()%100;
num[i]=randV
num0[i]=randV
num1[i]=randV
num2[i]=randV
num3[i]=randV
timeList[0]=(int)(selectionSort(num0,NUMBER)*20);
timeList[1]=(int)(bubbleSort(num1,NUMBER)*20);
timeList[2]=(int)(insertSort(num2,NUMBER)*20);
showChart(timeList,3);
printf(&each sort used time:\t&);
for(i=0;i&3;i++){
printf(&%d\t&,timeList[i]);
printf(&\n&);
double selectionSort(int num[],int count)
int i,j,min,minIndex,
clock_t begin,
begin = clock();
for(i = 0;i& (count-1);i++)
min=num[i];
minIndex=i;
for(j=i+1;j&j++)
if(num[j]&min)
min=num[j];
minIndex=j;
if(min&num[i])
temp=num[i];
num[minIndex]=
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
//display(num,count);
double bubbleSort(int num[],int count)
clock_t begin,
begin = clock();
for(i = 0;i & (count-1);i++)
for(j = i+1;j &j++){
if(num[i]&num[j]){
temp=num[j];
num[j]=num[i];
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
//display(num,count);
double insertSort(int num[],int count)
clock_t begin,
begin = clock();
for(i = 1;i &i++)
temp=num[i];
while((j&=0)&&(temp&num[j]))
num[j+1]=num[j];
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
void showChart(int num[],int count)
for(i=0;i&i++)
printf(&selectSort:&);
printf(&bubbleSort:&);
printf(&insertSort:&);
for(j=0;j&num[i];j++)
printf(&=&);
printf(&\n&);
void display(int num[],int count)
for(i=0;i&i++)
printf(&%d\t&,num[i]);
代码写得没有什么可观赏价值,有什么不足之处欢迎指出。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84734次
积分:1280
积分:1280
排名:千里之外
原创:41篇
(1)(1)(1)(2)(4)(3)(1)(3)(1)(1)(1)(1)(4)(2)(6)(11)看看选择排序的基本思想和排序过程
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
  众所周知在常用的简单排序方法中,前文所介绍的起泡排序(冒泡排序)是效率最差的一个了。我们今天所介绍的这个选择排序也是简单排序中的一种,不过比起泡排序的效率要高,并且也比较容易实现。
  这些常用的排序方法多见诸于C/C++方面的资料中,如果要在vfp中实现这些排序方法,原理是一样的,只是在代码实现上略有差别。例如,在C/C++中数组的下标是从0开始,而vfp中数组的下标是从1开始;C/C++中的for语句可以采用for(i=0;i&n;i++)这种形式来同时完成变量赋初值、变量终值判断、变量递增这些操作,而vfp的for语句则有些弱,它的变量终值不能采取i&n这种形式来界定一个范围。因为以上的区别,在VFP中书写代码时要特别注意数组下标问题及循环变量的初值及终值,在以后的文章中不会再特别提及这些问题。
  我们先看一下选择排序的基本思想和排序过程。(此部分内容引用自百度百科:http://baike.baidu.com/view/547263.htm)
  基本思想
  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
  选择排序是不稳定的排序方法。n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
  ①初始状态:无序区为R[1..n],有序区为空。
  ②第1趟排序
  在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
  ③第i趟排序
  第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1&i&n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
  这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
  排序过程
  【示例】:
  初始关键字 [49 38 65 97 76 13 27 49]
  第一趟排序后 13 [38 65 97 76 49 27 49]
  第二趟排序后 13 27 [65 97 76 49 38 49]
  第三趟排序后 13 27 38 [97 76 49 65 49]
  第四趟排序后 13 27 38 49 [49 97 65 76]
  第五趟排序后 13 27 38 49 49 [97 65 76]
  第六趟排序后 13 27 38 49 49 65 [97 76]
  第七趟排序后 13 27 38 49 49 76 [97 76]
  最后排序结果 13 27 38 49 49 76 76 97
  知道这个排序方法的基本思想和排序过程,在vfp中书写代码就简单了,只是需要注意vfp中数组的下标及循环变量的初值及终值与C/C++的区别。实例的运行界面如下图:
  本例依然采取生成10个随机整数的方式取得数据,然后用选择法对这10个整数进行从小到大的排序。实现过程:
  一、新建表单,向表单添加一个编辑框控件及三个命令按钮,按上图设置这三个命令按钮的caption属性。
  二、添加代码:
  1.&生成10个随机整数&按钮的click事件:
  public s(10)
  for i=1 to 10
  s(i)=int(rand()*100) &&产生两位数的随机整数
  thisform.edit1.value=thisform.edit1.value+str(s(i),5)
  endfor
  2.&清屏&按钮的click事件:thisform.edit1.value=&&
  3.&选择排序&按钮的click事件:
  local i,j,k,t as integer
  for i=1 to 9
  for j=i+1 to 10
  if s(j)&s(k)
  endfor
  t=s(k)
  s(k)=s(i)
  s(i)=t
  endfor
  thisform.edit1.value=&&
  for i=1 to 10
  thisform.edit1.value=thisform.edit1.value+str(s(i),5)
  endfor
  三、OK了,运行表单吧。
来源:网络
小编工资已与此赏挂钩!一赏一分钱!求打赏↓ ↓ ↓
如果你喜欢本文章,请赐赏:
已赐赏的人
我的电子书开发笔记之冒泡排序, 选择排序, 折半查找 - 推酷
开发笔记之冒泡排序, 选择排序, 折半查找
这两种排序, 一种搜索方法是都会去使用的通用算法, 这三种方法简单而有效, 所以我把这三种方法记录于此, 以便温故知新, 因为最近在仔细研究JAVA, 所以此篇代码都是以JAVA语言所写.
同时也对知识进行一下分享, 以方便大众.
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,所以大家就把这个排序的算法命名为冒泡排序, 这种排序方法的优点是有极佳的稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
这种算法因为其简单容易使用和稳定性较好, 成为了刚刚接触算法最好的入门算法之一.
综合上文可以知晓可见冒泡排序其核心思想就是经过相邻的两个元素之间的比较交换位置来进行排序的.
冒泡排序显而易见我们需要用到判断, 来判断数组中相邻两个元素的值
而两个元素之间的交换我们最常用的代码就是
if (arr1[j] & arr[j + 1]){
// 非常简单基础的交换瓶子中的水
int temp = arr[j + 1];
arr[j + 1] = arr[j];
而其中的 j 则代表了数组元素的下标
光是这样我们只能判断一次相邻数组的下标, 所以, 我们要让他&动&起来, 显而易见的, 我们需要用到for循环来联动 j 的值
for (int j = 0; j & arr.length - 1 - j++){
if (arr[j] & arr[j + 1]){
int temp = arr[j + 1];
arr[j + 1] = arr[j];
这个for的循环就可以让我们进行一次整体的排序了, 但是明显一次排序是不够的, 比如 4, 2 ,1 这种情况, 一次整体排序完成也只是变成 2, 1, 4 而且, 一次整体的排序只能够让一个最大的值&浮&上来, 但我们需要不断地让下一个最大值浮上来, 所以我们需要多次的排序
for (int i = 0; i & arr.length - 1; i++){
for (int j = 0; j & arr.length - 1 - j++){
if (arr[j] & arr[j + 1]){
int temp = arr[j + 1];
arr[j + 1] = arr[j];
每一次外圈的循环都会使一个最大值&浮&上来, 很明显的, 外圈的循环次数就是数组元素的个数, 而内圈的 arr.length - 1 - i 则是每一次外圈循环之后就有一个最大值&浮动&上来, 最后的值就不用再去检验了, 所以就是 - i.
最常用的一种冒泡排序的两种不同写法
int[] arr = {4, 2, 1, 5, 3, 7, 10, 9};
第一种, 也是讲解的一种
for (int i = 0; i & arr.length - 1; i++){
for (int j = 0; j & arr.length - 1 - j++){
if (arr[j] & arr[j + 1]){
int temp = arr[j + 1];
arr[j + 1] = arr[j];
for (int i = arr.length - 1; i & 0; i--)
for (int j = 0; j & j++)
if (arr[j + 1] & arr[j])
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] =
两种代码运行之后的结果是
// 遍历并打印数组中的值
for (int i:arr
System.out.println(i);
打印台出现的值
冒泡排序这么仔细就是要为选择排序打底
for (int i = 0; i & arr.length - 1; i++){
for (int j = i + 1; j & arr. j++){
if (arr[i] & arr[j]){
int temp = arr[i];
arr[i] = arr[j];
而这个就是选择排序
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
以一次循环为例子, 冒泡循环是一直两个两个相邻的比较排序, 而选择排序则是, 拿一个跟所有的待选择的数据比较而进行排序
这个方法就是二分法, 在生活当中其实也经常会用到, 很常见的, 在 1 到 100 当中想一个数, 我会问你50大于小于你想的数, 你说50小于你想的数, OK, 那75是不是你想的数字大了还是小了? 你说小了, 那87是不是, 大了, 93呢........
这个方法通过不断的对一个数组取中间数, 来判断这个数字到底是多少
int seach(int[] arr, int key){
// 折半查找(二分法)
// 前提: 有序的数据
// 有点: 效率高是个数组元素多的查找
int min, max,
max = arr.length - 1;
while (min &= max){
mid = (min + max) / 2;
if (arr[mid] & key){
min = mid + 1;
} else if (arr[mid] & key){
max = mid - 1;
System.out.println(mid);
return -1;
这个代码是用来查找数组中与key值相同值的下标
我们在使用的时候, 一般需要一个数组和一个key值, 这个key值就是你想要找出来的数字, 通过while去循环, mid就是不断被取中间值的下标, 中间值大于key则 最大值一定就是mid - 1 , mid & key 同理, 而一旦arr[mid] == key 则key值你就找到了.
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 冒泡排序效率 的文章

 

随机推荐