关于数组内排序计算次数的问题

不废话,直接上代码。

1.获取5个数中的最大数:

int[] score = {66,77,88,65,88};
int max = score[0];
for(int i=0;i<score.length-1;i++){
  if(max<score[i+1]){
    max = score[i+1];
  }
}

由此可以看出,计算的总次数为

计算个数   2   3   4    5  ... n

计算次数   1   2   3    4  ... n-1

最小数次数一样。

2.将6个数从小到大排列:(冒泡)

int[] a = { 55, 45, 23, 444, 313, 112 };
int c;
int count = 0;
for (int i = 1; i < a.length ; i++) {
  for (int j = 0; j < a.length-i; j++) {
    if (a[j] > a[j + 1]) {
      c = a[j + 1];
      a[j + 1] = a[j];
      a[j] = c;
    }
    count++;
  }
}
for (int i = 0; i < a.length; i++) {
  System.out.println(a[i] + "==" + count+"==="+a.length);
}

输出:

---------------------

23==15===6
45==15===6
55==15===6
112==15===6
313==15===6
444==15===6

---------------------

冒泡分析:

c = a[j + 1];
a[j + 1] = a[j];
a[j] = c;

变量C存在的意义就是存放a[j+1]并且在替换之后放入a[j]。

(随手画图不要见怪)

冒泡的交换次数依次为,(5,4,3,2,1)

每次完成内部for循环的目的是把最大的数放在最后,并在下次循环的时候去除,所以次数依次减一。

原文地址:https://www.cnblogs.com/fastfn/p/8987977.html

时间: 2024-08-07 00:05:48

关于数组内排序计算次数的问题的相关文章

数组长度计算

(1)sizeof     方法:sizeof(数组名)/ sizeof(数组类型名)      说明:数组占用字节除以数组类型所占字节,结果为数组元素个数    (2)strlen     说明:strlen,求字符串有效长度     方法:strlen(字符数组名)  //结果为字符数组有效字符长度,不包含末尾的' /0' 注意:当数组作为函数參数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen:所以,在传址时,应提供2个參数:1个是数组名,代表数组首地址

编程算法 - 数组中出现次数超过一半的数字 代码(C)

数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. 1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求. 2. 使用计数方法依次比較. 代码:  方法1: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */

寻找数组中出现次数超过一半的数字

[题 目]数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字. [思 路1]由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我们的任务就是对该数组进行排序,而性能最好的快速排序的时间复杂度为O(nlogn),我们可以直接借助库函数完成,由于其效率不是很高,所以这里就不再赘述. [思 路2]对于一个数组中的元素的次数的统计,最快的查找方法是什么?当然哈希表了!我们能不能建立哈希表呢,稍微思考,我们就可以发现,哈希表只适用于

【剑指offer】Q29:数组中出现次数超过一半的数字

就本题而言,个人觉得练习下partition函数是有必要的,毕竟它是快速排序的核心,是基础性的东西,也是必须要掌握的,至于书中给出的"取巧"性解法,是属于个人思维能力的考察,是一种考虑问题的思路,不是一两个问题就能练就的. partition函数,包括快速排序,是一定要信手拈来的,必须的. import random def MoreThanHalf(array): if len(array) == 0: return 0 start = 0 end = len(array) - 1

寻找数组中重复次数最多的数

#include<iostream> #include<map> using namespace std; int helper(const int a[],const int n) { map<int,int> m; for(int i = 0;i<n;i++) m[a[i]]++; map<int,int>::iterator comp = m.begin(); for( map<int,int>::iterator it = comp

47. 数组中出现次数超过一半的数字[Number appears more than half times]

[题目]:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. 例如长度为9的数组{1,2,3,2,2,2,5,4,2}中次数超过了数组长度的一半的数字为2,而长度为8的数组{1,2,3,2,2,2,5,4}则为非法输入. [思路一]:先对数组进行排序,再遍历排序后的数组,统计每个数的次数,出现次数最大的数即为要找的数. 时间复杂度:O(nlgn)+ O(n)= O(nlgn):空间复杂度:O(1). [思路二]:先对数组进行排序,出现次数超过数组长度的一半的数必然是数组中间的那个数.

找出数组中出现次数超过一半的元素

题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int half_number(int a[], int n) { if( a == NULL || n <= 0 ) return -1; int i, candidate; int times = 0; for( i=0; i<n; i++ ) { if( times == 0 ) { candidate

数据结构-数组中出现次数超过一半的数字

题目:数字中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 分析:首先进行排序,因为大于一半,所以说经过排序之后的数组,如有次数大于的话说明那个数肯定是数组中间的那个数. #include <iostream> using namespace std; void QickSort(int *a,int n,int low,int high){ int i=l

算法之找出数组中出现次数大于n/m的元素

最经典的题目莫过于是: 在一个数组中找出出现次数超过n/2的元素?更进一步的,找出数组中出现次数大于n/3的所有元素? 注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个. 关于这一类题目的解题思路,可以先讲一个游戏 称作 "俄罗斯方块".这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行. 例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4