排序算法
排序算法分类
我们这里写的都只是内部排序,即只使用内存的排序算法
- 插入排序
1.1 直接插入排序
1.2 希尔排序 - 选择排序
2.1 简单选择排序
2.2 堆排序(所需辅助空间最小) - 交换排序
3.1 冒泡排序
3.2 快速排序(平均速度最快) - 归并排序(所需辅助空间最多)
- 基数排序
排序算法选择
- 当数据规模较小----> 直接插入排序或冒泡排序
- 如果全部为正整数----> 桶排序
- 我们说的快排最好是指大量随机数据下,快排的平均时间复杂度最好
- 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。其中冒泡排序和归并排序是稳定的,希尔排序和堆排序是不稳定的。
Java 算法例子
斐波那契数列
/**
* 有一对兔子,从出生后第3个月起每个月都生一对兔子,
* 小兔子长到第三个月后每个月又生一对兔子,
* 假如兔子都不死,问每个月的兔子总数为多少?
* @param month 第几个月
* @return 当月兔子总数
*/
public Integer rabbit(int month){
// 数字规律1,1,2,3,5,8,13,21....后面一个永远是前面两个之和,也就是斐波那契数列
if(month==1||month==2){
return 1;
}else{
return rabbit(month-1)+rabbit(month-2);
}
}
水仙花数
/**
* 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
* 153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方
*/
public void daffodilNumber(){
for(int i=100;i<1000;i++){
int i1 = i/100;
int i2 = (i-i1*100)/10;
int i3 = i-i1*100-i2*10;
if(i==i1*i1*i1+i2*i2*i2+i3*i3*i3){
System.out.print(i+",");
}
}
}
分解质因数
/**
* 将一个正整数分解质因数
* 例如:输入90,打印出90=2*3*3*5
* @param num 要分解的正整数
* @return 分解结果
*/
public String resolveNumber(int num){
String result = num + "=";
int i = 2;
while (i<num) {
if (num % i == 0) {
result+=i + "*";
num = num / i;
} else {
i++;
}
}
return result+=i;
}
最大公约数和最小公倍数
/**
* 输入两个正整数,求其最大公约数和最小公倍数
* @param a,b 输入的两个正整数
*/
public void comonDivisor (int a,int b){
for(int i=a>b?b:a;i>=1;i--){
if(a%i==0 && b%i==0){
System.out.println("最大公约数"+i);
System.out.println("最小公倍数"+a*b/i);
return;
}
}
}
完数
/**
* 一个数如果恰好等于它的因子之和,这个数就称为"完数"
* 例如6=1+2+3.编程 找出10000以内的所有完数
*/
public void wanShu (){
for(int index=1;index<=10000;index++){
int sum = 1,i=2,temp = index;
while(i<=temp){
if(temp%i==0){
sum+=i;
temp=temp/i;
}else{
i++;
}
}
if(sum==index){
System.out.print(index+",");
}
}
}
计算年度第几天
/**
* 输入某年某月某日,判断这一天是这一年的第几天
*/
public int day(int year,int month,int day){
int date = 0;
int arr[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {//闰年
arr[1] = 29;
}
for (int i = 0; i < month - 1; i++) {
date += arr[i];
}
date += day;
return date;
}
序列求和
/**
* 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...
* 求出这个数列的前num项之和
*/
public Double add(int num){
Double i1=1d;
Double i2=2d;
Double result = 0d;
for(int i=0;i<num;i++){
result+=(i2/i1);
i2 = i1+i2;
i1 = i2-i1;
}
return result;
}
阶乘
/**
* 求n!,也就是1*2*3*4乘到n过
*/
public int multiplicate(int n){
if(n==1){
return 1;
}else{
return n*multiplicate(n-1);
}
}
素数
/**
* 求n之内的素数
*/
public void primeNumber(int n){
int j = 0 ;
boolean isprime = true;
for(int i=2;i<=n;i++){
j = (int) (Math.sqrt(i));
for(int m=2;m<j;m++){
if(i%m==0){
isprime = false;
break;
}
}
if(isprime){
System.out.print(i+",");
}
isprime = true;
}
}
杨辉三角形
/**
* 打印出杨辉三角形
*/
public void yanghui(int line) {
int[] a = new int[line];
for (int i = 0; i < line; i++) {
a[i] = 1;
}
if (line == 1) {
System.out.println(1);
} else if (line == 2) {
System.out.println(1);
System.out.println(1 + "\t" + 1);
} else {
System.out.println(1);
System.out.println(1 + "\t" + 1);
for (int i = 1; i < line - 1; i++) {
for (int j = i; j >= 1; j--) {
a[j] = a[j] + a[j - 1];
}
for (int k = 0; k < i + 2; k++) {
System.out.print(a[k] + "\t");
}
System.out.println();
}
}
}
围圈报数
/**
* 有n个人围成一圈,顺序排号。
* 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,
* 问最后留下的是原来第几号的那位
*/
public void quit(int n) {
int[] a = new int[n];
int i = 0;
int t = 0;
while (n > 1) {
if (a[i] == 0) {
t++;
if (t == 3) {
t = 0;
a[i] = 1;
n--;
}
}
i++;
if(i == a.length){
i = 0;
}
}
for(int j=0;j<a.length;j++){
if(a[j]!=1){
System.out.println(j+1);
}
}
}
一个偶数总能表示为两个素数之和
public void even(int num) {
int j = 0, num2 = 0, flag = 0, tag = 0, temp = 0;
for (int i = 3; i <= num/2; i++) {
j = (int) Math.sqrt(i);
for (int k = 2; k <= j; k++) {
if (i % k == 0) {
flag = 1;
}
}
if (flag == 0) {
num2 = num - i;
temp = (int) Math.sqrt(num2);
for (int k = 2; k <= temp; k++) {
if (num2 % k == 0) {
tag = 1;
}
}
if (tag == 0 && num2 >= 3) {
System.out.println(num + "=" + i + "+" + num2);
}
tag = 0;
}
flag = 0;
}
}
选择题
-
下列数据结构具有记忆功能的是
A.队列
B.循环队列
C.栈
D.顺序表
栈先进后出。最先进去的数肯定是最后出来的 所以说有记忆功能。队列是先进先去,如果进行出队操作,最先的元素就出队没有了,没有记忆功能。 -
在选项中,只要指出表中任何一个结点的位置,就可以从它出发依次访问到表中其他所有结点。
A.线性单链表
B.双向链表
C.线性链表
D.循环链表
简答题
heap (堆)和 stack(栈)有什么区别
栈是一种线形集合,其添加和删除元素的操作应在同一段完成,按照后进先出的方式进行处理;
堆是栈的一个组成元素。
JAVA 中引用及原始类型变量都放在栈中,new 出来的对象放在堆中
栈和队列的共同特点是什么
只允许在端点处插入和删除元素
栈通常采用的两种存储结构是什么
线性存储、链表存储
用链表表示线性表的优点是什么
便于插入和删除操作
在单链表中,增加头结点的目的是
方便运算的实现
循环链表的主要优点是什么
从表中任一结点出发都能访问到整个链表
树是结点的集合,它的根结点数目是多少
有且只有 1
在深度为 5 的满二叉树中,叶子结点的个数为
2 的 4 次方=16
设一棵二叉树中有 3 个叶子结点,有 8 个度为 1 的结点,则该二叉树中总的结点数为多少
2*3+8-1=13
算法是指什么,他的四个基本特征,可以用哪几种控制结构组成
算法是解题方案的准确而完整的描述,他有四个特征:可行性、确定性、有穷性和拥有足够的情报,一般都可以用顺序、选择、循环等控制结构组合而成
算法的时间、空间复杂度是指
算法执行过程中所需要的基本运算次数、存储空间
算法分析的目的是
分析算法的效率以求改进
数据的存储结构是指什么
数据的逻辑结构在计算机中的表示
数据的逻辑结构是指
反映数据元素之间逻辑关系的数据结构
设一棵完全二叉树共有 699 个结点,则在该二叉树中的叶子结点数为
n/2 向上取整=350
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为
线性结构和非线性结构
串的长度是
串中所含字符的个数
设有两个串 p 和 q,求 q 在 p 中首次出现位置的运算称做
模式匹配
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于