排序算法

蓝桥杯 java 算法训练 排序

大憨熊 提交于 2020-02-26 15:16:15
算法训练 排序 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。   输入格式:输入只有一行,即三个整数,中间用空格隔开。   输出格式:输出只有一行,即排序后的结果。   输入输出样例 样例输入 9 2 30 样例输出 30 9 2 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int[] x = new int[3]; int temp, i, j; for (i = 0; i < 3; i++) { x[i] = in.nextInt(); } for (i = 0; i < 3; i++) { for (j = i; j < 3; j++) { if (x[j] > x[i]) { temp = x[i]; x[i] = x[j]; x[j] = temp; } } System.out.print(x[i] + " "); } } } 来源: CSDN 作者: 看书程序员 链接: https://blog.csdn

Java实现的5大排序算法

拈花ヽ惹草 提交于 2020-02-26 15:11:29
Java实现的5大排序算法 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。   废话不多说,下面逐一看看经典的排序算法:   1、Java排序算法之选择排序   选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。   举个实例来看看:   1.初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]   2.3.i = 0: [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2])   4.5.i = 1: [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17])   6.7.i = 2: [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16])   8.9.i = 3: [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 无需交换 )   10.11.i = 4:

排序算法

风格不统一 提交于 2020-02-26 13:41:21
1、冒泡排序 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 function bubbleSort ($arr) { $len = count($arr);      //该层循环控制 需要冒泡的轮数 for ($i=1; $i<$len; $i++) {        //该层循环用来控制每轮 冒出一个数 需要比较的次数 for ($k=0; $k<$len-$i; $k++) { if($arr[$k] > $arr[$k+1]) { $tmp = $arr[$k+1]; // 声明一个临时变量 $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; } 2、选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。 //实现思路 双重循环完成,外层控制轮数

二分查找--34. 在排序数组中查找元素的第一个和最后一个位置

不羁岁月 提交于 2020-02-26 13:19:51
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 代码实现 class Solution { public: int left_index(vector<int>& nums,int target) { int begin = 0; int end = nums.size() - 1; while(begin <= end) { int mid = (begin + end) / 2; if(nums[mid] == target) { if(mid == 0 || nums[mid - 1] < target) { return mid; } end = mid - 1; } else if(target < nums[mid]) { end = mid - 1; } else if(target > nums[mid]) { begin = mid + 1; } } return -1; } int right_index(vector<int>& nums,int target) { int begin

算法之排序(中)-c语言实现

我的未来我决定 提交于 2020-02-26 11:36:42
文章来源: http://blog.seclibs.com/算法之排序中-c语言实现/ 上一篇文章里说了归并排序和快速排序,它们的代码实现是非常相似的,只要理解了其中的具体实现,还是比较容易写出代码的。 归并排序 代码如下,需要下载代码的请移步至文末 快速排序 代码如下,需要下载代码的请移步至文末 代码: 归并排序: GitHub 快速排序: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3163548

[golang] 数据结构-鸡尾酒排序

醉酒当歌 提交于 2020-02-26 05:05:21
吐个槽 又是一个不正经取名的排序算法。真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序) 原理 鸡尾酒排序(Cocktail Sort)是 冒泡排序 的一种优化算法。原本的冒泡排序只能在一轮中挑出一个值移动到最后,而鸡尾酒则可以在一轮里挑最大的移到最后,再挑最小的移到最前面。实际上就是先正向进行一轮普通的冒泡排序,然后再逆向进行一轮反向冒泡,每轮冒泡都缩小一点范围。 复杂度 最好情况是正序排列的数列O(n),最坏情况是逆序O(n^2),平均还是O(n^2)。空间复杂度都是O(1)。 排序过程 特别找来一张图,方便理解。注意看图中红色标记的元素,每次向右都是把最大的元素交换到后面,向左都是把最小的交换到前面。 代码 package main import ( "time" "fmt" "math/rand" ) func main() { var length = 10 var list []int // 以时间戳为种子生成随机数,保证每次运行数据不重复 r := rand.New(rand.NewSource(time.Now().UnixNano())) for i := 0; i < length; i++ { list = append(list, int(r.Intn(1000))) } fmt

排序算法

本秂侑毒 提交于 2020-02-26 02:46:09
1. 排序的基本概念与分类 (1)稳定性:关键字相等的记录在排序后没有改变起初的先后关系,那么该排序是稳定的 (2)内排序与外排序   内排序:待排序记录全部在内存里 外排序:记录数太多,排序时要在内外存之间多次交换数据   内排序:     时间性能:比较、移动     辅助空间     算法的复杂性:算法本身的复杂性   内排序主要分类:插入排序(直接插入排序、希尔排序)、交换排序(冒泡、快速)、选择排序(简单选择、堆排序)、归并排序 (3)各排序算法复杂度汇总 冒泡:O(N 2 ) 2. 排序 #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; int length; }sqList; 2.1 冒泡排序 属于交换排序   数组长为n (1)v1   从最前面开始,两两相邻元素比较。如果前面的比后面的大,就交换(升序);如果前面的比后面的小,就交换(降序)。   两层for循环,数组长为n则要进行 n-1 次大循环,每经过一个大循环,一个最大的数(或最小的数)就交换到最后面去了。   比较次数:n-1 + n-2 +...+1=(n 2 -n)/2 比较次数是固定的   交换次数:最坏是(n 2 -n)/2   稳定性:由于写的是只有大于或者小于才交换,且交换发生在相邻的元素上,所以是稳定的 1 //flag==true

Java8中的Streams用法解析

六眼飞鱼酱① 提交于 2020-02-26 02:39:33
原文出处: https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/index.html 为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。 什么是聚合操作

golang实现选择排序算法

冷暖自知 提交于 2020-02-26 00:55:41
package alg //选择排序 func Selection(arr []int) []int { len := len(arr) tmp := 0 if len <= 1 { return arr } for i := 0; i < len; i++ { minInt := i //最小值下标 for j := i + 1; j < len; j++ { if arr[j] < arr[minInt] { minInt = j //交换下标 } } //交换值 tmp = arr[minInt] arr[minInt] = arr[i] arr[i] = tmp } return arr } 来源: oschina 链接: https://my.oschina.net/hackdebug/blog/3158598

排序之归并排序

半腔热情 提交于 2020-02-26 00:13:22
排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序 下面介绍下归并排序 归并排序 原理: 建立在归并操作上的一种有效的排序算法 将已有序的子序列合并,得到完全有序的序列 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并 归并排序是一个稳定的排序 实现方式 合并:是归并排序的核心操作 代码如下: private void merge(int[] array, int left, int mid, int right) { int i = left; int j = mid; int length = right - left; int[] extra = new int[length]; int k = 0; while(i < mid && j < right) { if(array[i] <= array[j]) { extra[k++] = array[i++]; } else { extra[k++] = array[j++]; } } while (i < mid) { extra[k++] = array[i++]; } while (j < right) { extra[k++] = array[j++]; } // 从 extra 搬移回 array for (int