总结了很久的排序算法,自己测试了很多次,一直写在笔记本上,还是怕弄丢了,还是贴到博客上面来吧
//冒泡排序:
/** * 交换排序--冒泡排序 * * @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)”的资料中,我们将会深入探讨多种常见的排序算法,包括它们的基本原理、优缺点以及实际应用。** 首先,我们要了解排序的目的是为了使数据有序,这在数据处理和分析中具有广泛...
总结而言,不同的查找和排序算法各有优劣,选择合适的算法需考虑数据的特性、空间限制以及预期的执行效率。在笔试和面试中,熟练掌握这些算法不仅能够展示候选人的编程能力,还能体现其对算法理论的深入理解。
在IT领域,排序算法和字符操作是两个非常基础且重要的概念,经常出现在面试和技术讨论中。下面我们将深入探讨这两个主题。 首先,让我们关注排序算法。排序是计算机科学中最基本的操作之一,它涉及到将一组数据按照...
在IT面试中,排序算法是常见的话题,它们是计算机科学基础的重要组成部分,尤其对于数据处理和算法优化至关重要。以下是对几种经典排序算法的详细解析: 1. **插入排序(Insertion Sort)** 插入排序是一种简单的...
【IT面试笔试中的排序算法Java实现】 在IT面试和笔试中,掌握各种排序算法的实现是必不可少的技能。本文将详细介绍几种经典的排序算法,并提供Java语言的实现代码,包括冒泡排序、插入排序、选择排序和快速排序。...
本篇文章将对一些常见的面试算法题目进行总结,重点讨论Python语言下的实现方式。 一、排序算法 1. 冒泡排序:基础排序算法,通过不断交换相邻的逆序元素来完成排序。Python实现简洁易懂,但效率较低。 2. 快速...
面试高频算法题总结-剑指Offer题解,主要包含: 数据结构 数组 字符串 链表 栈和队列 二叉树 图 堆 线段树 字典树 单调栈 算法 二分查找 排序 递归 动态规划 分治 记忆化搜索 贪心 回溯 位运算 数学 设计 其他 共66...
以下是对"面试最常见的问题(java各种排序法)"这一主题的详细解释。 首先,我们来了解一下排序的基本定义:排序是将一组数据按照特定顺序进行排列的过程。在计算机科学中,这通常指的是对数组或列表等数据结构中的...
### 【面试必备】排序、查找算法总结 ...以上是对查找和排序算法的基本总结。这些算法不仅在面试中经常被问及,也是实际编程工作中不可或缺的基础知识。希望本文能够帮助大家更好地理解和掌握这些算法。
7. **排序算法**:快速排序、归并排序和堆排序是常见的排序算法。快速排序在平均情况下效率高,但最坏情况为O(n^2),可以通过随机化选取枢轴优化。归并排序稳定但需要额外空间,堆排序不稳定但原地排序。 8. **快排...
本文将详细介绍在IT面试中常见的算法题,特别是排序算法,包括快速排序的实现。快速排序是一种高效的排序算法,它的平均时间复杂度为O(n log n),在最坏的情况下(输入数组已经完全有序或逆序)时间复杂度为O(n^2)。...
**定义与原理**:快速排序是一种非常高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 **Java实现**: 这里给出快速排序的核心思想,具体代码略。 **时间...
将数据结构中的排序算法,如选择排序,冒泡排序,插入排序,希尔排序,快速排序,堆排序等排序算法做出总结,IT程序员笔试面试必备。
以下是在编程面试中排名前10的算法相关的概念,通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。本文将从Java的角度看问题,包含下面的这些概念:
总结来说,归并排序和堆排序都是高效的排序算法,它们在不同场景下有不同的优缺点。归并排序是稳定的排序,时间复杂度为 O(n log n),但需要额外的空间存储子序列。而堆排序在原地进行,不需要额外空间,但不是稳定...
在面试中,特别是针对开发和测试开发岗位,候选人被要求掌握并能够灵活运用各种排序算法,直接排序法通常作为基础考察点。本文将深入探讨直接排序法的概念、原理以及在VS2015环境下如何实现。 直接排序法,又称简单...
一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...
在面试中,了解这些排序算法的原理、优缺点以及适用场景是至关重要的。对于项目中的职责和主要模块,面试官可能会询问实现的优化、性能瓶颈以及潜在的改进方案。对于排序算法的实现,优化可能包括减少不必要的比较和...
它通过将待排序的数组元素按某个增量分组,然后对每组使用直接插入排序算法排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。`SerSort`函数展示了希尔排序的...