冒泡排序、快速排序(快排)、KMP算法的Java实现_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 冒泡排序、快速排序(快排)、KMP算法的Java实现

冒泡排序、快速排序(快排)、KMP算法的Java实现

 2018/3/15 15:47:30  笨小孩在早起  程序员俱乐部  我要评论(0)
  • 摘要:人太懒了,好久没发文章了。今天就写点自己的算法实现吧。比较简单恐贻笑大方之家,但又觉得还是记录下来比较好。前两天qq里有人再说他老大不懂java但在招聘Java工程师。所以就选择语言无关又能考察下能力的最大公约数----算法。大概是冒泡排序、快速排序(快排)、二分查找、KMP算法。做Java大家都懂,可以通过comparable和Comparator的方式来方便的排序,所以大家平常对这些基础的算法都生疏了。也为了锻炼下自身的算法逻辑,就自己试着实现了一遍。可能会和大家找的算法实现很相似
  • 标签:实现 Java 算法 快速排序 冒泡排序
  人太懒了,好久没发文章了。今天就写点自己的算法实现吧。比较简单恐贻笑大方之家,但又觉得还是记录下来比较好


  前两天qq里有人再说他老大不懂java但在招聘Java工程师。所以就选择语言无关又能考察下能力的最大公约数----算法。大概是冒泡排序快速排序(快排)、二分查找、KMP算法。
  做Java大家都懂,可以通过comparable和Comparator的方式来方便的排序,所以大家平常对这些基础的算法都生疏了。也为了锻炼下自身的算法逻辑,就自己试着实现了一遍。可能会和大家找的算法实现很相似,只能说简单算法的实现还是比较难创新的。
通过Junit的方式测试的,引入了apache common的一点工具方法,但这些不重要,大家看代码吧。
class="java">
package algorithm;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.stream.Stream;

import org.junit.Test;

public class SortTest {

	private Integer[] generateTestArray() {

		ArrayList<Integer> originList = new ArrayList<>();
		Random random = new Random(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));
		Stream.generate(random::nextInt).limit(20).forEach(originList::add);

		System.out.println(originList);
		Integer[] tempArr = new Integer[20];
		originList.toArray(tempArr);
		return tempArr;
	}

	@Test
	public void nnnnn() {

		Integer[] tempArr = generateTestArray();
		for (int i = 0; i < tempArr.length - 1; i++) {

			boolean swapFlag = false;
			for (int j = 0; j < tempArr.length - 1 - i; j++) {

				if (tempArr[j] > tempArr[j + 1]) {
					int temp = tempArr[j];
					tempArr[j] = tempArr[j + 1];
					tempArr[j + 1] = temp;
					swapFlag = true;
				}
			}
			if (swapFlag == false) {
				break;
			}
		}
		Arrays.stream(tempArr).forEach(System.out::println);
	}

	public int middleIndex(Integer[] tempArray, int low, int high) {

		int temp = tempArray[low];
		while (low < high) {

			while (low < high && tempArray[high] > temp) {
				high--;
			}
			tempArray[low] = tempArray[high];
			while (low < high && tempArray[low] < temp) {
				low++;
			}
			tempArray[high] = tempArray[low];
		}
		tempArray[high] = temp;
		return high;
	}

	public void recursiveByQuickSort(Integer[] tempArray, int low, int high) {

		if (low < high) {

			int middleIndex = middleIndex(tempArray, low, high);
			recursiveByQuickSort(tempArray, low, middleIndex - 1);
			recursiveByQuickSort(tempArray, middleIndex + 1, high);
		}
	}

	@Test
	public void quickSort() {

		Integer[] tempArray = generateTestArray();
		recursiveByQuickSort(tempArray, 0, tempArray.length - 1);
		System.out.println(Arrays.asList(tempArray));

		tempArray = new Integer[]{-2127313485, -2022230754, -1525774655, -1266487529, -1246088751, -1237557299, -1220678150, -669061349, -587792801, -441728115, -388929620, -228781073, -5476750, 424415588, 631901841, 878929975, 1519073389, 1526646025, 1791609759, 2002233420};
		System.out.println(Arrays.asList(tempArray));
		System.out.println(binaryQuery(tempArray, -587792801));
	}

	private int binaryQuery(Integer[] tempArray, int val) {

		int low = 0, high = tempArray.length - 1;
		while (low < high) {

			int middle = (low + high) / 2;
			if (tempArray[middle] < val) {
				low = middle + 1;
			} else if (tempArray[middle] > val) {
				high = middle - 1;
			} else {
				return middle;
			}
		}
		if (low == high && tempArray[low] == val) {
			return low;
		}
		return -1;
	}
}



package algorithm;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;

public class KMPTest {
	
	private int[] suffixMatchPrefixMatchSequence(String queryStr) {
		
		char[] charArray = queryStr.toCharArray();
		int charLength = charArray.length,
				lastIndex = charLength - 1;
		
		if (charLength <= 2) {
			
			return null;
		}
		
		final int[] matchSequence = new int[charLength];
		outFor : for (int i = 1; i < charLength; i++) {
			int tempI = i;
			for (int j = 0; j <lastIndex && tempI < charLength; j++, tempI++) {
				char ic = charArray[tempI];
				char jc = charArray[j];
				if (ic != jc) {
					matchSequence[tempI] = 0;
					break;
				}
				matchSequence[tempI] = j + 1;// 做偏移的减法操作,所以从1开始
				if (tempI == lastIndex) {
					break outFor;
				}
			}
		}
		System.out.println(StringUtils.join(matchSequence, ','));
		return matchSequence;
	}
	
	public int matchedStartIndex(String targetStr, String queryStr) {
		
		char[] targetCharArray = targetStr.toCharArray(),
				queryCharArray = queryStr.toCharArray();
		
		int targetCharArrayLength = targetCharArray.length, 
				queryCharArrayLength = queryCharArray.length, 
				matchStartIndex = 0,
				queryLastIndex = queryCharArrayLength - 1;
		final int[] matchSequence = this.suffixMatchPrefixMatchSequence(queryStr);
		while (matchStartIndex < targetCharArrayLength) {
			
			int tempMatchStartIndex = matchStartIndex;
			int i = 0;
			for (; i < queryCharArrayLength && tempMatchStartIndex < targetCharArrayLength; i++, tempMatchStartIndex++) {
				
				char qc = queryCharArray[i],
						tc = targetCharArray[tempMatchStartIndex];
				if (qc == tc) {
					continue;
				}
				break;
			}
			if (i > queryLastIndex) {// 完全匹配后还会做+1操作,所以条件加上>
				
				return matchStartIndex;
			}
			
			matchStartIndex += ArrayUtils.isEmpty(matchSequence) ? 1 : (i - matchSequence[i]) == 0 ? 1 : i - matchSequence[i];
		}
		
		return -1;
	}
	
	
	@Test
	public void test() {
		
		String targetStr = "56132asdasdasfsf4dasa123",
				queryStr = "dasa123";
		System.out.println(this.matchedStartIndex(targetStr, queryStr));
	}
}

上一篇: java并发之同步辅助类semaphore 下一篇: 没有下一篇了!
发表评论
用户名: 匿名