有序数组排序

问题:

给定一个数组,其值先从小到大递增后从大到小递减,找出最大的值。

思路:最简单的办法就是从第二个值开始,判断是否满足 A[i] > A[i-1] && A[i] > A[i+1]. 如果满足,i 就是那个最大值的下标。该算法复杂度为O(n).

我们可以改进这种算法,因为这个数组是排好序的,所以我们可以利用二分查找的思想,更快速的找到最大值,时间复杂度为O(lg n)。

二分查找的算法可以在后面的link处得到,二分查找的退出条件和这道题的退出条件是不一样的(详见while loop),这是很值得注意的地方。

http://blog.csdn.net/beiyeqingteng/article/details/5736004

[java] view plain copy

  1. public int turningPoint(int[] A) {
  2. int m = A.length;
  3. int begin = 0;
  4. int end = m - 1;
  5. int tp = begin + (end - begin)/2;
  6. // the condition "tp > 0 && tp < m -1" makes sure that tp is not at the beginning or the end
  7. while (tp > 0 && tp < m -1) {
  8. if (A[tp] > A[tp + 1] && A[tp] > A[tp -1]) {
  9. return tp;
  10. } else if (A[tp] < A[tp+1]) {
  11. begin = tp + 1;
  12. tp = begin + (end - begin)/2;
  13. } else {
  14. end = tp - 1;
  15. tp = begin + (end - begin)/2;
  16. }
  17. }
  18. return -1;
  19. }
时间: 2024-08-30 05:18:43

有序数组排序的相关文章

LeetCode—Merge Sorted Array两个有序数组排序

Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m

[读书笔记]算法(Sedgewick著)·第二章.初级排序算法

本章开始学习排序算法 1.初级排序算法 先从选择排序和插入排序这两个简单的算法开始学习排序算法.选择排序就是依次找到当前数组中最小的元素,将其和第一个元素交换位置,直到整个数组有序. 1 public static void sort(Comparable a[]){ 2 int N = a.length; 3 for(int i = 0; i < N; i ++){ 4 int min = i; //最小元素索引 5 for(int j = i + 1; j < N; j++){ 6 if(

5. 排序算法2

图解 1. 选择排序 /* * 选择排序 * * 在未排序序列中找到最小元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾. * 以此类推,直到所有元素均排序完毕. */ int[] num = {2,3,1,5,4}; //控制遍历次数 for (int i = 0; i < num.length-1; i++) { //记录每次遍历的起始下标位置,默认为最小值 int minIndex = i; for (int j = i+1; j < num.l

八大排序算法总结及C/C++实现

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1. 插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

【C++面试】常考题复习:排序算法

// Sort.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> /************************************************************************/ /* copyright (c) 2014 kernel_main /* c++面试常考点 /* 转载请注明出处:http://www.cnblogs.com/kernel0815/

[大、小根堆应用总结一]堆排序的应用场景

前言 在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解.因此,我打算单独将关于堆的应用独立总结出来,后面每遇到一种跟堆结构相关的应用都放到这个目录下. 堆的定义 n个关键字序列L[1-n]称为堆,当且仅当该序列满足: 1. L(i)<=L(2i)且L(i)<=L(2i+1)或 2. L(i)>=L(2i)且L(i)>=L(2i+1) 满足第一个条件的成为小根堆(即每个结点值小于它的

【Python实现归并排序】 &#213125;

原文: http://blog.gqylpy.com/gqy/347 "首先,归并排序使用了二分法,归根到底的思想还是分而治之.拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去.然后再将它们按照两个有序数组的样子合并起来.这样说起来可能很难理解,所以 图就来了: 归并排序将数组以中间的值进行拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序. 两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后将放入空数组的那个

20191209-八大排序之归并排序

1. 归并排序 算法核心思想 归并排序使用了二分法,归根到底的思想还是分而治之.拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并.归并排序是一种稳定的排序方法.具体逻辑实现如下: 将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序 合并2个排序数组的操作为: a)     同时对两个数组的第一个位置进

浅谈Java后端开发工程师腾讯面试经历分享总结

最近一段时间考虑到换工作,打算整理一下网络上曾经面试者分享的的面试经历并结合自己以往的面试经历和经验,帮助大家获取到互联网大厂的入职通知书,也就是入职offer. 本文整理网络面试者和本人的面试经历和面试经验分享给大家,主要出于个人层面上做个自我总结.沉淀一下面试经历以及让一些有能力的面试者了解一些互联网大厂企业面试过程,如果有人向往这些大厂企业,告知面试者需要做哪些准备从而能够如愿以偿的获取到互联网大厂企业的入职通知书. 面试做好提前准备 一谈到面试这个问题,很多人都会心里一紧,尤其是一些生性