`

算法相关1

 
阅读更多
1.选择排序:不稳定,时间复杂度 O(n^2)
2.插入排序:稳定,时间复杂度 O(n^2)
3.冒泡排序:稳定,时间复杂度 O(n^2)
4.堆排序:不稳定,时间复杂度 O(nlog n)
5.归并排序:稳定,时间复杂度 O(nlog n)
6.快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
7.希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2



快速排序:
采用递归,第一次以第一位作为中轴,高位放中轴右边(高位与地位置换),低位放中轴左边,再递归左边,递归右边。
https://www.cnblogs.com/0201zcr/p/4763806.html

二分法查找:
package test_yhl.thread;

public class MinAbsTest{
    
	private static int findLocation(int[] testInt, int value) {
		
		int left = 0;
		int right = testInt.length-1;
		
		int LocationValue = 0;
		while(left<= right) {//=
			int middle = (right+left)/2;//+,放在while里面
			if (value < testInt[middle]) {
				right = middle-1;//-1
			}else if(value > testInt[middle]){
				left = middle+1;//+1
			} else{
				LocationValue= middle;
				break;//break;
			}
		}
		return LocationValue;
	}
	
    public static void main(String[] args) throws InterruptedException{  

    	int[] testInt = new int[]{3,10,29,43,48,74,86,300};//new int[]{}
    	System.out.println(findLocation(testInt,300));		
    }
}


插入排序:
http://blog.csdn.net/booirror/article/details/45339387
两层循环,第一层顺序循环,第二层在未排序序列从后向前比较置换值,直到未排序序列最后值置替换为此次值。
插入排序原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序核心:假设第一个元素排好,之后的元素对排好的部分从后向前比较并逐一移动。
package test_yhl.thread;

import java.util.Arrays;

public class MinAbsTest{
    
	public static void main(String[] arg) {
		int[] testInts = new int[]{6,7,112,7,12,34};
		
		int y = 0;// y在for外
		for (int x=0; x<testInts.length; x++) {
			int tem = testInts[x]; //必须定义临时testInts[x]
			for (y=x; y>0 && tem < testInts[y-1]; y--) {
				testInts[y] = testInts[y-1];//[y] [y-1]
			}
			testInts[y] = tem;// [y]
		}
		
		System.out.println(Arrays.toString(testInts));
	}
}

 8 2 4 9 3 6  首先我们考虑数字2,假设后面的数字不存在(手中只有一张8,又抓来了2),那么显然2应该放在8的前面。

  2 8 4 9 3 6  又抓来了一张4,现在大家都知道应该怎么办了吧?

  2 4 8 9 3 6  又来了个9,没错,正好不用换顺序

  2 4 8 9 3 6  同样的道理,考虑3该放的位置,显然放在2和4的中间

  2 3 4 8 9 6  最后一个也是一样,最后得到从小到大的序列

  2 3 4 6 8 9  完成排序

选择排序:
从左到右边一个一个区比较,左边已排序越来越多,右边未排序越来越少
package test_yhl.thread;

import java.util.Arrays;

public class MinAbsTest{
    static int z;
	public static void main(String[] arg) {
		int[] a = new int[]{16,7,338,12,34,112};

		int n=a.length;
		int i,j,k;
		for(i=0; i<n; i++){
			k=i;
			for(j=i+1; j<n;j++){
				if(a[k] > a[j]){// [k] [j]
					k=j;
				}
			}
			if(a[k]!=a[i]) {
				int tem = a[i];
				a[i] = a[k];
				a[k] = tem;
			}
		}

		System.out.printf(Arrays.toString(a));
	}
}


冒泡排序:
原理:比较两个相邻的元素,将值大的元素交换至右端。
package test_yhl.thread;

import java.util.Arrays;

public class MinAbsTest{
    static int z;
	public static void main(String[] arg) {
		int[] a = new int[]{-13,-32,-8,5512,6,34,7,338,112};

		int i,j;
		for(i =0;i<a.length-1;i++) {
			for(j=0; j<a.length-1-i; j++) { // -1-i
				
				if(a[j]>a[j+1]) {
//如果是绝对值排序 if(Math.abs(a[j])>Math.abs(a[j+1])) {
// Math.pow(b,2);表示b的平方
					int tem = a[j];
					a[j] = a[j+1];
					a[j+1] = tem;
				}
			}
		}
		
		System.out.println(Arrays.toString(a));
	}
}


归并排序:
https://www.cnblogs.com/chengxiao/p/6194356.html
package org.xdemo.example.SpringActivemq.service.consumer;

import java.util.Arrays;

public class ConsumerTest {

	public static void main(String[] args) throws Exception {
        int []arr = {9,8,7,6,5,4,3,2,1};
        int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
        sort(arr,0,arr.length-1,temp);
        System.out.println(Arrays.toString(arr));
    }

    private static void sort(int[] arr,int left,int right,int []temp){
        if(left<right){
            int mid = (left+right)/2;
            sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
            sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
            merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
// 第一个子组合式,left到mid;第二个子组合是mid+1到right。
        }
    }
    private static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;//左序列指针
        int j = mid+1;//右序列指针
        int t = 0;//临时数组指针
        while (i<=mid && j<=right){ // <=
            if(arr[i]<=arr[j]){
                temp[t++] = arr[i++];
            }else {
                temp[t++] = arr[j++];
            }
        }
        while(i<=mid){//将左边剩余元素填充进temp中 <=
            temp[t++] = arr[i++];
        }
        while(j<=right){//将右序列剩余元素填充进temp中<=
            temp[t++] = arr[j++];
        }
        t = 0;
        //将temp中的元素全部拷贝到原数组中
        while(left <= right){ //<=
            arr[left++] = temp[t++];
        }
    } 
}


堆排序:
https://www.cnblogs.com/jingmoxukong/p/4303826.html
https://www.cnblogs.com/chengxiao/p/6129630.html

股票最佳买入时机:
        
        int aa[] = {1,8,6,3,5,9,11,10,6};
        int min = aa[0];
        int max = 0; // 最大收益
        for (int i =0; i<aa.length; i++) {
            if(aa[i] < min) {
                min = aa[i];
            }
            if(aa[i] - min > max) {
                max = aa[i] - min ;
            }
        }
        System.out.println(max);
//10



二叉树层次遍历:借助队列Queue
VacantCountVo vacantCountVo2 = new VacantCountVo();
        vacantCountVo2.setValue(9);
        VacantCountVo vacantCountVo3 = new VacantCountVo();
        vacantCountVo3.setValue(20);

        VacantCountVo vacantCountVo1 = new VacantCountVo();
        vacantCountVo1.setValue(3);
        vacantCountVo1.setLeft(vacantCountVo2);
        vacantCountVo1.setRight(vacantCountVo3);

        Queue<VacantCountVo> queue = new LinkedList<>();
        queue.add(vacantCountVo1);

        List<List<Integer>> listList = new ArrayList<>();

        while (!queue.isEmpty()) {

            List<Integer> list = new ArrayList<>();
            int count = queue.size();
            while(count > 0) {
                VacantCountVo vacantCountVo4 = queue.poll();
                if (vacantCountVo4.getLeft() != null) {
                    queue.add(vacantCountVo4.getLeft());
                }
                if (vacantCountVo4.getRight() != null) {
                    queue.add(vacantCountVo4.getRight());
                }
                list.add(vacantCountVo4.getValue());
                count --;
            }

            listList.add(list);
        }

        System.out.println(JSON.toJSONString(listList));
// [[3],[9,20]]


二个数组怎样找出公共部分,两个数组的交集
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set = new HashSet<>();
         int c[] = null;
         for(int i = 0;i<nums1.length;i++) {
             for(int j=0; j<nums2.length;j++){
                 if(nums1[i] == nums2[j]) {
                     set.add(nums1[i]);
                 }
             }
         }
        Iterator<Integer> iterator = set.iterator();
        int []a = new int[set.size()];
        int z = 0;
        while (iterator.hasNext()){
            a[z++] = iterator.next();
        }
        return a;
    }
}


class Solution {
    public int[] intersection(int[] arrayA, int[] arrayB) {

        Set<Integer> intersectionSet = new HashSet();
        Arrays.sort(arrayA);
        Arrays.sort(arrayB);

        int indexArrayA = 0;
        int indexArrayB = 0;
        int sizeArrayA = arrayA.length;
        int sizeArrayB = arrayB.length;
        while (indexArrayA < sizeArrayA) {
            for (int i = indexArrayB; i < sizeArrayB; i++) {
                if (arrayA[indexArrayA] == arrayB[i]) {
                    intersectionSet.add(arrayA[indexArrayA]);
                    indexArrayA++;
                    indexArrayB++;
                    break;
                } else if (arrayA[indexArrayA] < arrayB[i]) {
                    indexArrayA++;
                    break;
                } else if (i == sizeArrayB - 1) {
                    indexArrayA++;
                }
            }
        }
        
        Iterator<Integer> iterator = intersectionSet.iterator();
        int []a = new int[intersectionSet.size()];
        int i = 0;
        while (iterator.hasNext()){
            a[i++] = iterator.next();
        }

        return a;
    }
}


整数数组按照绝对值排序
快速排序比较时用Math.abs()
















  • 大小: 13.1 KB
分享到:
评论

相关推荐

    KWIK算法相关1

    KWIK算法相关1 KWIK算法是解决不确定线性系统中约束满足问题的一种方法。该算法通过添加一个预测参考滤波器来满足点时间输入和/或状态不等式约束。下面是KWIK算法的关键知识点: 1. 约束满足问题:在控制系统设计...

    免疫算法与遗传算法比较1

    1. 算法介绍与比较: 遗传算法(GA)的核心在于通过种群中个体的适应度评价,进行选择、交叉和变异操作,以寻找问题的全局最优解。它的主要步骤包括:初始化种群、适应度评估、遗传操作(选择、交叉、变异)以及...

    相位恢复算法相关的几种算法,包括角谱迭代算法,GS算法,TTIE强度方程恢复算法,以及算法的结合.zip

    1. 角谱迭代算法(Gerchberg-Saxton Algorithm,GS算法) 角谱迭代算法由Gerchberg和Saxton于1972年提出,是一种基于傅里叶变换的相位恢复方法。该算法通过在空间域和频域之间进行交替迭代,逐步逼近真实相位。基本...

    《计算机算法设计与分析》算法实现题2-1

    算法实现题2-1是书中的一个重要练习,虽然具体的题目内容没有给出,但通常这类题目会涉及基础的算法类型,如排序、查找、图论或者动态规划等。在计算机科学的学习过程中,实践和理解算法的实现是至关重要的。下面...

    算法笔记1_算法笔记PAT_算法笔记_

    这份笔记对于学习者来说,是提升算法能力,准备相关考试的重要工具。 首先,算法是计算机科学的基础,它是一系列解决问题的清晰指令,是程序设计的核心。在C/C++中,算法的高效实现能够直接影响程序的性能。笔记中...

    国密算法(国家商用密码算法简介).pdf

    国密算法是中国的国家商用密码算法的简称,它包含了一系列的加密技术标准和规范,这些算法和规范被用于...了解这些算法不仅有助于在技术上进行研究和开发,还有助于在政策和法规上了解和遵循中国相关的信息安全标准。

    DDA算法、中点bresenham算法及bresenham算法,带报告

    1、 复习有关算法的基本原理,明确实验目的和要求; 2、 依据算法思想,绘制程序流程图; 3、 设计程序界面,要求操作方便; 4、 用C/C++语言编写源程序并调试、执行; 5、 分析实验结果 6、 对程序设计过程中出现...

    A5算法 A5算法 A5算法

    A5算法是搜索引擎优化(SEO)领域中一个重要的概念,主要与Google的PageRank算法相关。PageRank是Google创始人 Larry Page 提出的一种衡量网页重要性的算法,而A5算法则是对这一理论的一种扩展和改进。在理解A5算法...

    wK算法算法处理RADARSAT-1数据_share

    由于只给出了“WKA”这一文件名,可以推测这可能是一个包含wK算法相关代码或文档的文件,可能是用Matlab编写的脚本或函数,或者是算法的说明文档。具体内容无法确定,但很关键,因为它是整个处理流程的核心部分。 *...

    蒙特卡罗算法、最优化算法

    图论算法是解决图论相关问题的算法,它包括最短路、网络流、二分图等不同算法,适用于解决与网络相关的问题。 数值分析算法是高级语言编程中常用的算法,包括方程组求解、矩阵运算、函数积分等。在建模竞赛中,这类...

    灰狼优化算法和粒子群优化算法比较

    标题中的“灰狼优化算法和粒子群优化算法比较”指的是在优化问题中,对两种流行的启发式算法——灰狼优化算法(Grey Wolf Optimizer, GWO)与粒子群优化算法(Particle Swarm Optimization, PSO)的性能进行分析和...

    数据辅助型三种定时同步算法:S&C定时同步算法及仿真、Minn算法及仿真、Park算法及其仿真..zip

    S&C算法的核心在于利用数据的自相关特性,找到最佳的同步时刻,从而提高数据解码的准确性。 接着,Minn算法是一种基于滑窗技术的定时同步方法。它通过对接收信号进行分段处理,计算每段信号的自相关函数,选取自...

    C常用算法程序集,各种经典算法

    因此,这个C语言算法程序集可能覆盖了这些领域的实例代码,有助于开发者深入理解并掌握相关算法。 此外,对于初学者来说,通过阅读和运行这些代码,可以提升编程技巧,理解算法思想,以及如何将理论知识转化为实际...

    银行家算法pdf文献打包共9篇 银行家算法.rar

    银行家算法pdf文献打包 共9篇 解晨,王瑜.多资源银行家算法研究与实现[J].电脑知识与技术,2013,9(18):4229-4233. 摘要:在通常情况下,计算机的资源有限,比如只有一台打印机或者只有有限的内存,并且很多资源是独占性...

    BM算法和sunday算法相关的原始论文

    除了这两篇主要论文,其他压缩包中的文件也涉及了相关主题。例如,"IMAGE PROCESSING-PATTERN RECOGNITION-using BOYER-MOORE.pdf"可能探讨了BM算法在图像处理和模式识别中的应用,这些领域经常需要对大量的像素数据...

    代码 去趋势互相关分析的DCCA算法

    代码 去趋势互相关分析的DCCA算法代码 去趋势互相关分析的DCCA算法代码 去趋势互相关分析的DCCA算法代码 去趋势互相关分析的DCCA算法代码 去趋势互相关分析的DCCA算法代码 去趋势互相关分析的DCCA算法代码 去趋势互...

    数据挖掘18大算法实现以及其他相关经典DM算法

    期望最大化算法,可以拆分为2个算法,1个E-Step期望化步骤,和1个M-Step最大化步骤。他是一种算法框架,在每次计算结果之后,逼近统计模型参数的最大似然或最大后验估计。详细介绍链接 Apriori Apriori算法是关联...

    种子填充算法,扫描线填充算法,带报告

    1. 复习有关算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(指定填充多边形); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行(最好能用动画显示填充过程); 5. 分析...

    算法导论.epub

    本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...

    1、 LMS算法与RLS算法有何异同点? 2、 自适应均衡器可以采用哪些最佳准则

    LMS算法的优点是收敛速度较快,且计算量小,但它也存在一些缺点,如收敛速度慢、要求元素必须是彼此独立的向量序列、信号的自相关矩阵的特征值大小相差较大时收敛速度较慢等。 二、RLS算法 RLS算法(Recursive ...

Global site tag (gtag.js) - Google Analytics