知识大全 十大排序算法面试题
Posted 元素
篇首语:君不见长松卧壑困风霜,时来屹立扶明堂。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 十大排序算法面试题相关的知识,希望对你有一定的参考价值。
选择排序 选择排序的基本思想是对待排序的记录序列进行n 遍的处理 第i遍处理是将L[i n]中最小者与L[i]交换位置 这样 经过i遍处理之后 前i个记录的位置已经是正确的了
选择排序是不稳定的 算法复杂度是O(n ^ ) class SelectionSorter private int min; public void Sort(int[] arr) for (int i = ; i < arr.Length - 1; ++i) min = i; for (int j = i + 1; j < arr.Length; ++j) if (arr[j] < arr[min]) min = j; int t = arr[min]; arr[min] = arr[i]; arr[i] = t; 冒泡排序 冒泡排序方法是最简单的排序方法。WINgwIT.cOm这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。 冒泡排序是稳定的。算法时间复杂度是O(n ^2) class EbullitionSorter public void Sort(int[] arr) int i, j, temp; bool done = false; j = 1; while ((j < arr.Length) && (!done))//判断长度 done = true; for (i = 0; i < arr.Length - j; i++) if (arr[i] > arr[i + 1]) done = false; temp = arr[i]; arr[i] = arr[i + 1];//交换数据 arr[i + 1] = temp; j++;
快速排序 快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n ^2)。 class QuickSorter private void swap(ref int l, ref int r) int temp; temp = l; l = r; r = temp; public void Sort(int[] list, int low, int high) int pivot;//存储分支点 int l, r; int mid; if (high <= low) return; else if (high == low + 1) if (list[low] > list[high]) swap(ref list[low], ref list[high]); return; mid = (low + high) >> 1; pivot = list[mid]; swap(ref list[low], ref list[mid]); l = low + 1; r = high; do while (l <= r && list[l] < pivot) l++; while (list[r] >= pivot) r–; if (l < r) swap(ref list[l], ref list[r]); while (l < r); list[low] = list[r]; list[r] = pivot; if (low + 1 < r) Sort(list, low, r - 1); if (r + 1 < high) Sort(list, r + 1, high);
插入排序 插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。图1演示了对4个元素进行插入排序的过程,共需要(a),(b),(c)三次插入。 直接插入排序是稳定的。算法时间复杂度是O(n ^2) 。
public class InsertionSorter public void Sort(int[] arr) for (int i = 1; i < arr.Length; i++) int t = arr[i]; int j = i; while ((j > 0) && (arr[j - 1] > t)) arr[j] = arr[j - 1];//交换顺序 –j; arr[j] = t;
希尔排序 希尔排序基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2
归并排序 设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。
其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)。 ///
///
无序的数组 ///
///
左数组 ///
右数组 ///
///
input array ///
the value arrange in input array ///
堆排序是不稳定的。算法时间复杂度O(nlog n)。 ///
///
///
///
private void HeapSort(ref double[] dblArray) for (int i = dblArray.Length – 1; i >= 0; i–) if (2 * i + 1 < dblArray.Length) int MinChildrenIndex = 2 * i + 1; //比较左子树和右子树,记录最小值的Index if (2 * i + 2 < dblArray.Length) if (dblArray[2 * i + 1] > dblArray[2 * i + 2]) MinChildrenIndex = 2 * i + 2; if (dblArray[i] > dblArray[MinChildrenIndex])
ExchageValue(ref dblArray[i], ref dblArray[MinChildrenIndex]); NodeSort(ref dblArray, MinChildrenIndex); ///
///
///
private void NodeSort(ref double[] dblArray, int StartIndex) while (2 * StartIndex + 1 < dblArray.Length) int MinChildrenIndex = 2 * StartIndex + 1; if (2 * StartIndex + 2 < dblArray.Length) if (dblArray[2 * StartIndex + 1] > dblArray[2 * StartIndex + 2]) MinChildrenIndex = 2 * StartIndex + 2; if (dblArray[StartIndex] > dblArray[MinChildrenIndex]) ExchageValue(ref dblArray[StartIndex], ref dblArray[MinChildrenIndex]); StartIndex = MinChildrenIndex;
///
///
///
cha138/Article/program/sjjg/201405/30939相关参考
面试时,有几个问题是公司面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,下面就面试十大必考题做出分析:(1)为什么想进本公司?这通常是面试官最先问到的问题。此时面试官
面试时,有几个问题是公司面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,下面就面试十大必考题做出分析(1)为什么想进本公司?这通常是面试官最先问到的问题。此时面试官就
面试时,有几个问题是公司面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,下面就面试十大必考题做出分析:(1)为什么想进本公司?这通常是面试官最先问到的问题。此时面试官
面试时,有几个问题是公司面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,下面就面试十大必考题做出分析: (1)为什么想进本公司? &n
面试时,有几个问题是公司面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,下面就面试十大必考题做出分析:(1)为什么想进本公司?这通常是面试官最先问到的问题。此时面试官
面试的"十大必考题"谨防哑口无言 以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs
cha138/Article/program/sjjg/201404/30583
腾讯算法题服务器内存G有一个G的文件里面每行存著一个QQ号(位数)怎么最快找出出现过最多次的QQ号G内存两个G的文件每个文件格式为每行是一个url地址找出这个两个文件中重复的url地址(典型的url去
(1)一个整数数列,元素取值可能是0—65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意-5个数值
最近在面试遇到很多排序算法问题总结一下 定义数组如下 [java] int[]array=newint[]; int[]array=newint[]; 首先是插入排序 [java]