`

面试排序算法个人总结

 
阅读更多

总结了很久的排序算法,自己测试了很多次,一直写在笔记本上,还是怕弄丢了,还是贴到博客上面来吧

//冒泡排序:

/**
	 * 交换排序--冒泡排序
	 * 
	 * @param arr
	 */
	public static void bubbleSort(long arr[]) {
		int exchange = 1;// 1为有交换,0为无交换
		// 最多需要arr.length-1次交换(i不是下标)
		for (int i = 0; i < arr.length - 1; i++) {//需要做arr.length - 1交换
			exchange = 0;
			for (int j = arr.length - 1; j > i; j--) {//j>i的原因:每一趟都会将一个最小的数排到前面(正确的位置)
				if (arr[j - 1] > arr[j]) {
					long temp = arr[j];
					arr[j] = arr[j - 1];
					arr[j - 1] = temp;
					exchange = 1;
				}
			}
			if (exchange == 0) {
				return;
			}
		}
	}

 插入排序:

/**
	 * 直接插入排序
	 * 
	 * @param arr
	 */
	public static void insertSort(long[] arr) {
		long temp = 0;
		for (int i = 1; i < arr.length; i++) {
			temp = arr[i];
			int j = i;
			while (j > 0 && arr[j - 1] > temp) {
				arr[j] = arr[j - 1];
				j--;
			}
			arr[j] = temp;
		}
	}

   希尔排序:

/**
	 * 希尔排序
	 * @param arr
	 */
	public static void shellSort(long arr[]) {
		for (int dk = arr.length / 2; dk >= 1; dk = dk / 2) {// dk为增量
			for (int i = dk; i < arr.length; ++i) {
				if (arr[i] < arr[i - dk]) {
					long temp = arr[i];
					int j = i;
					while (j > dk - 1 && arr[j - dk] > temp) {
						arr[j] = arr[j - dk];
						j -= dk;
					}
					arr[j] = temp;
				}
			}
		}
	}

 快速排序:

	// 划分数组
	public static int partition(long arr[], int left, int right) {
		int leftPtr = left - 1;
		int rightPtr = right;
		long pivot = arr[right];
		while (true) {
			while (leftPtr < rightPtr && arr[++leftPtr] < pivot)
				;
			while (rightPtr > leftPtr && arr[--rightPtr] > pivot)
				;
			if (leftPtr >= rightPtr) {
				break;
			} else {
				// long temp = arr[leftPtr];
				// arr[leftPtr]=arr[rightPtr];
				// arr[rightPtr] = temp;
				swap(arr, leftPtr, rightPtr);
			}
		}
		// long temp = arr[leftPtr];
		// arr[leftPtr]=arr[right];
		// arr[right] = temp;
		swap(arr, leftPtr, right);
		return leftPtr;
	}

	private static void swap(long arr[], int i, int j) {
		long temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	// 快速排序
	public static void quickSort(long arr[], int left, int right) {
		if (left < right) {
			int pivotPos = partition(arr, left, right);
			quickSort(arr, left, pivotPos - 1);
			quickSort(arr, pivotPos + 1, right);
		}
	} 

  堆排序:

public static void heapSort(int[] array) {
		initHeap(array);
		// 这个过程就是不断的从堆顶移除,调整
		for (int i = 1; i < array.length; i++) {
			int temp = array[0];
			int end = array.length - i;
			array[0] = array[end];
			array[end] = temp;
			adjustHeap(array, 0, end);
		}
	}

	private static void initHeap(int[] array) {
		for (int i = array.length / 2 - 1; i >= 0; i--) {
			adjustHeap(array, i, array.length);
		}
	}

	private static void adjustHeap(int[] array, int n, int size) {
		int temp = array[n]; // 先拿出数据
		int child = n * 2 + 1; // 这个是左孩子
		while (child < size) { // 这个保证还有左孩子
			// 如果右孩子也存在的话,并且右孩子的值比左孩子的大
			if (child + 1 < size && array[child + 1] > array[child]) {
				child++;
			}
			if (array[child] > temp) {
				array[n] = array[child];
				n = child; // n需要重新计算
				child = n * 2 + 1; // 重新计算左孩子
			} else {
				// 这种情况说明左右孩子的值都比父结点的值小break;
			}
		}
		array[n] = temp;
	}

 //归并排序

public static int[] mergeSort(int[] array, int left, int right) {
		if (left == right) {
			return new int[] { array[left] };
		}
		int mid = (right + left) / 2;
		int[] l = mergeSort(array, left, mid);
		int[] r = mergeSort(array, mid + 1, right);
		return merge(l, r);
	}

	// 将两个数组合并成一个
	public static int[] merge(int[] l, int[] r) {
		int[] result = new int[l.length + r.length];
		int p = 0;
		int lp = 0;
		int rp = 0;
		while (lp < l.length && rp < r.length) {
			result[p++] = l[lp] < r[rp] ? l[lp++] : r[rp++];
		}
		while (lp < l.length) {
			result[p++] = l[lp++];
		}
		while (rp < r.length) {
			result[p++] = r[rp++];
		}
		return result;
	}

 //选择排序

// 每次从中选出最小的元素,只进行一次交换
	// 相比冒泡,大大减少了元素的交换次数
	public static void selectSort(int[] array) {
		for (int i = 0; i < array.length; i++) { // 确定了多少个元素
			int min = i; // 每次都默认第一个是最小的
			for (int j = i + 1; j < array.length; j++) {
				if (array[min] > array[j]) {
					min = j;
				}
			}
			int temp = array[min];
			array[min] = array[i];
			array[i] = temp;
		}
	}

 

分享到:
评论

相关推荐

    面试必备:排序算法汇总

    在准备面试时,掌握各种排序算法是至关重要的,特别是对于那些目标是软件开发或系统设计职位的求职者。本文将详细介绍C++和C语言中7种常见的排序算法,旨在帮助你提升技能,顺利通过面试。 1. 冒泡排序(Bubble ...

    各种排序算法总结(ppt)

    在这个名为“各种排序算法总结(ppt)”的资料中,我们将会深入探讨多种常见的排序算法,包括它们的基本原理、优缺点以及实际应用。** 首先,我们要了解排序的目的是为了使数据有序,这在数据处理和分析中具有广泛...

    各种查找与排序算法-笔试面试必备

    总结而言,不同的查找和排序算法各有优劣,选择合适的算法需考虑数据的特性、空间限制以及预期的执行效率。在笔试和面试中,熟练掌握这些算法不仅能够展示候选人的编程能力,还能体现其对算法理论的深入理解。

    面试排序算法 字符操作算法

    在IT领域,排序算法和字符操作是两个非常基础且重要的概念,经常出现在面试和技术讨论中。下面我们将深入探讨这两个主题。 首先,让我们关注排序算法。排序是计算机科学中最基本的操作之一,它涉及到将一组数据按照...

    常用面试排序算法文档

    在IT面试中,排序算法是常见的话题,它们是计算机科学基础的重要组成部分,尤其对于数据处理和算法优化至关重要。以下是对几种经典排序算法的详细解析: 1. **插入排序(Insertion Sort)** 插入排序是一种简单的...

    IT面试笔试-各种排序算法Java实现

    【IT面试笔试中的排序算法Java实现】 在IT面试和笔试中,掌握各种排序算法的实现是必不可少的技能。本文将详细介绍几种经典的排序算法,并提供Java语言的实现代码,包括冒泡排序、插入排序、选择排序和快速排序。...

    面试高频算法题总结,个人博客

    本篇文章将对一些常见的面试算法题目进行总结,重点讨论Python语言下的实现方式。 一、排序算法 1. 冒泡排序:基础排序算法,通过不断交换相邻的逆序元素来完成排序。Python实现简洁易懂,但效率较低。 2. 快速...

    面试高频算法题总结-剑指Offer题解

    面试高频算法题总结-剑指Offer题解,主要包含: 数据结构 数组 字符串 链表 栈和队列 二叉树 图 堆 线段树 字典树 单调栈 算法 二分查找 排序 递归 动态规划 分治 记忆化搜索 贪心 回溯 位运算 数学 设计 其他 共66...

    面试最常见的问题(java各种排序法)

    以下是对"面试最常见的问题(java各种排序法)"这一主题的详细解释。 首先,我们来了解一下排序的基本定义:排序是将一组数据按照特定顺序进行排列的过程。在计算机科学中,这通常指的是对数组或列表等数据结构中的...

    【面试必备】排序、查找算法总结

    ### 【面试必备】排序、查找算法总结 ...以上是对查找和排序算法的基本总结。这些算法不仅在面试中经常被问及,也是实际编程工作中不可或缺的基础知识。希望本文能够帮助大家更好地理解和掌握这些算法。

    面试常见基础算法题总结

    7. **排序算法**:快速排序、归并排序和堆排序是常见的排序算法。快速排序在平均情况下效率高,但最坏情况为O(n^2),可以通过随机化选取枢轴优化。归并排序稳定但需要额外空间,堆排序不稳定但原地排序。 8. **快排...

    it面试算法题整理 全 包括笔试面试常考的 剑指offer 程序员面试宝典 各种排序算法等 自己总结的

    本文将详细介绍在IT面试中常见的算法题,特别是排序算法,包括快速排序的实现。快速排序是一种高效的排序算法,它的平均时间复杂度为O(n log n),在最坏的情况下(输入数组已经完全有序或逆序)时间复杂度为O(n^2)。...

    java 排序 面试题

    **定义与原理**:快速排序是一种非常高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 **Java实现**: 这里给出快速排序的核心思想,具体代码略。 **时间...

    数据结构排序算法总结

    将数据结构中的排序算法,如选择排序,冒泡排序,插入排序,希尔排序,快速排序,堆排序等排序算法做出总结,IT程序员笔试面试必备。

    面试中的排序算法总结

    以下是在编程面试中排名前10的算法相关的概念,通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。本文将从Java的角度看问题,包含下面的这些概念:

    java面试java排序算法

    总结来说,归并排序和堆排序都是高效的排序算法,它们在不同场景下有不同的优缺点。归并排序是稳定的排序,时间复杂度为 O(n log n),但需要额外的空间存储子序列。而堆排序在原地进行,不需要额外空间,但不是稳定...

    zhijiepaixufa_vs面试直接排序法_

    在面试中,特别是针对开发和测试开发岗位,候选人被要求掌握并能够灵活运用各种排序算法,直接排序法通常作为基础考察点。本文将深入探讨直接排序法的概念、原理以及在VS2015环境下如何实现。 直接排序法,又称简单...

    面试题 写一个堆排序算法 c++

    一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...

    排序算法总结.docx

    在面试中,了解这些排序算法的原理、优缺点以及适用场景是至关重要的。对于项目中的职责和主要模块,面试官可能会询问实现的优化、性能瓶颈以及潜在的改进方案。对于排序算法的实现,优化可能包括减少不必要的比较和...

    互联网面试常见算法总结.docx

    它通过将待排序的数组元素按某个增量分组,然后对每组使用直接插入排序算法排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。`SerSort`函数展示了希尔排序的...

Global site tag (gtag.js) - Google Analytics