常见算法的记录

快速排序

时间复杂度 O(n*log2n)

总结起来,快排的核心算法只有两步:

1)sort排序函数中,调用分区函数partition,将大的数组分成两块,然后再分别调用sort函数,这是一个递归过程。

2)partition分区函数

public class QSort {

	public static void main(String[] args) {
		quicksort qs = new quicksort();
		int data[] = { 44, 22, 2, 32, 54, 22, 88, 77, 99, 11 };
		qs.data = data;
		qs.sort(0, qs.data.length - 1);
		qs.display();
	}

}

class quicksort {
	public int data[];

	private int partition(int sortArray[], int low, int hight) {
		int key = sortArray[low];

		while (low < hight) {
			while (low < hight && sortArray[hight] >= key)
				hight--;
			sortArray[low] = sortArray[hight];

			while (low < hight && sortArray[low] <= key)
				low++;
			sortArray[hight] = sortArray[low];
		}
		sortArray[low] = key;
		return low;
	}

	public void sort(int low, int hight) {
		if (low < hight) {
			int result = partition(data, low, hight);
			sort(low, result - 1);
			sort(result + 1, hight);
		}

	}

	public void display() {
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i]);
			System.out.print(" ");
		}
	}
}

二分查找算法

public class BinarySearch {
	private int rCount=0;
	private int lCount=0;

	/**
	 * 获取递归的次数
	 * @return
	 */
	public int getrCount() {
		return rCount;
	}

	/**
	 * 获取循环的次数
	 * @return
	 */
	public int getlCount() {
		return lCount;
	}

	/**
	 * 执行递归二分查找,返回第一次出现该值的位置
	 * @param sortedData	已排序的数组
	 * @param start			开始位置
	 * @param end			结束位置
	 * @param findValue		需要找的值
	 * @return				值在数组中的位置,从0开始。找不到返回-1
	 */
	public int searchRecursive(int[] sortedData,int start,int end,int findValue)
	{
		rCount++;
		if(start<=end)
		{
			//中间位置
			int middle=(start+end)>>1;	//相当于(start+end)/2
			//中值
			int middleValue=sortedData[middle];

			if(findValue==middleValue)
			{
				//等于中值直接返回
				return middle;
			}
			else if(findValue<middleValue)
			{
				//小于中值时在中值前面找
				return searchRecursive(sortedData,start,middle-1,findValue);
			}
			else
			{
				//大于中值在中值后面找
				return searchRecursive(sortedData,middle+1,end,findValue);
			}
		}
		else
		{
			//找不到
			return -1;
		}
	}

	/**
	 * 循环二分查找,返回第一次出现该值的位置
	 * @param sortedData	已排序的数组
	 * @param findValue		需要找的值
	 * @return				值在数组中的位置,从0开始。找不到返回-1
	 */
	public int searchLoop(int[] sortedData,int findValue)
	{
		int start=0;
		int end=sortedData.length-1;

		while(start<=end)
		{
			lCount++;
			//中间位置
			int middle=(start+end)>>1;	//相当于(start+end)/2
			//中值
			int middleValue=sortedData[middle];

			if(findValue==middleValue)
			{
				//等于中值直接返回
				return middle;
			}
			else if(findValue<middleValue)
			{
				//小于中值时在中值前面找
				end=middle-1;
			}
			else
			{
				//大于中值在中值后面找
				start=middle+1;
			}
		}
		//找不到
		return -1;
	}
}

public class BinarySearchTest {  
	public static void main(String[] args) {
		BinarySearch bs=new BinarySearch();  
        
        int[] sortedData={1,2,3,4,5,6,6,7,8,8,9,10};  
        int findValue=9;  
        int length=sortedData.length;  
          
        int pos=bs.searchRecursive(sortedData, 0, length-1, findValue);  
        System.out.println("Recursice:"+findValue+" found in pos "+pos+";count:"+bs.getrCount());  
        int pos2=bs.searchLoop(sortedData, findValue);  
          
        System.out.println("Loop:"+findValue+" found in pos "+pos+";count:"+bs.getlCount());  
	}
}
时间: 2024-08-07 02:41:32

常见算法的记录的相关文章

常见算法特征记录

接触逆向分析1年来,接触了一些常见的加密算法,如果了解加密算法的特征点,那么会给逆向分析提供巨大的帮助. MD5,MD4算法初始化使用的常数为 0x67452301,0xefcdab89,0x98badcfe,0x10325476 MD5算法在计算过程中会使用下面常数作为轮转的数据 第一轮 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501, 0x698098d8,0x8b

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

机器学习常见算法优缺点总结

机器学习常见算法优缺点总结 K近邻:算法采用测量不同特征值之间的距离的方法进行分类. 优点: 1.简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归: 2.可用于数值型数据和离散型数据: 3.训练时间复杂度为O(n):无数据输入假定: 4.对异常值不敏感 缺点: 1.计算复杂性高:空间复杂性高: 2.样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少): 3.一般数值很大的时候不用这个,计算量太大.但是单个样本又不能太少 否则容易发生误分. 4.最大的缺点是无法给

字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置.比如原字符串为"ABCDEFG",子串为"DEF",则算法返回3.常见的算法包括:BF(Brute Force,暴力检索).RK(Robin-Karp,哈希检索).KMP(教科书上最常见算法).BM(

常见算法用Pascal实现

基本算法    这些都是非常基本的的算法,希望所有学习的人都能理解!        1.数论算法      求两数的最大公约数      function gcd(a,b:integer):integer;      begin      if b=0 then gcd:=a      else gcd:=gcd (b,a mod b);      end ;           求两数的最小公倍数      function lcm(a,b:integer):integer;      beg

Hadoop学习笔记—12.MapReduce中的常见算法

一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. (3)排序:按某个Key进行升序或降序排列 (4)TopK:对源数据中所有数据进行排序,取出前K个数据,就是TopK. 通常可以借助堆(Heap)来实现TopK问题. (5)选择:关系代数基

iOS常见算法以及应用

算法比较 关键词 二分 递归 分治 回溯 冒泡排序 思想:两次循环,外层进行循环次数的控制,内层循环,进行数据之间的比较,大的数据上浮(下沉) 12345678910111213141516171819202122232425262728293031323334353637383940 #pragma mark - Objective-C//冒泡排序- (void)bubbleSort:(id)array{ if (!([array isKindOfClass:[NSArray class]]

机器学习常见算法分类汇总

机器学习常见算法分类汇总 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里 IT 经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性. 学习方式 根据数据类型的不同,对一个问题的建模有不同的方式.在机器学习或者人工智能领域,人们首先会考虑算法的学习

前端常见算法JS实现

算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的. 排序算法 1. 冒泡排序 //冒泡排序 function bubbleSort(arr){ var i = j = 0; for(i=1;i<arr.length;i++){ for(j=0;j<=arr.length-i;j++){ var temp = 0; if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } 2.