冒泡排序

冒泡排序、插入排序、快速排序

Deadly 提交于 2020-01-18 01:56:24
一、冒泡排序 #include<iostream> using namespace std; void bubble_sort(int a[],int len) { int i,j,temp; int exchange=0; for(i=0;i<len;i++) { exchange=0; for(j=1;j<=len-i-1;j++) if(a[j-1]<a[j]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; exchange=1; } if(exchange!=1) return; } } int main() { int a[]={7,3,5,8,9,1,2,4,6}; bubble_sort(a,9); for(int i=0;i<9;i++) cout<<a[i]<<" " ; return 0; } 二、插入排序 #include<iostream> using namespace std; void insert_sort(int a[],int n) { int i=0,j=0,temp=0; for(i=1;i<n;i++) { temp=a[i]; for(j=i-1;temp<a[j]&&j>=0;j--) a[j+1]=a[j]; a[j+1]=temp; } } int main() { int a[]={7,3,5,8

冒泡排序

允我心安 提交于 2020-01-17 02:18:04
在观看了关于数组的内容了后,有一个关于排序的视频,这就是冒泡排序,那么关于它的解释是这样的:“ 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 ”这个是来自百度百科的。 但是在看视频后要有自己的理解,通俗一些就是有一堆数字需要你去排序,但是需要一个个来比较,毕竟计算机一次只干一件事,就是处理的快,所以呢对于冒泡的排序就是我们在一堆数字当中,让第一个数字进行比较,然后如果大于这个数那我们就让它进行位置交换,然后和后面的继续交换,当然如果这个数字小于被比较的那这个被比较的数字就待在这个位置不动,比较的数字继续向后和后面的数字进行比较,当第一轮的数字比较完之后,还是从第一个数字进行开始比较一直循环到这组数排序完成。 int[] nums = new int[] { 45, 34, 65, 23, 656, 23 }; int temp = 0; for (int j = 0; j < nums.Length - 1; j++) //所代表的是几轮比较 { for (int i = 0; i < nums.Length - 1 - j; i++) //这个代表的是这一轮的几次比较 { if (nums[i] > nums[i + 1]) {

排序(冒泡排序、快速排序)

て烟熏妆下的殇ゞ 提交于 2020-01-16 14:56:44
基本排序分类图: 关于排序的稳定性 在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 一、 冒泡排序 冒泡排序的基本思想:每次比较两个 相邻 的元素,如果它们的顺序错误就把他们交换过来 冒泡排序的原理:每一趟只能确定将一个数归位,如果有n个数进行排序,只需将n-1个数归位,也就是说要进行n-1趟操作,而每一趟都需要从第1位开始进行相邻两个数的比较 1 #include <stdio.h> 2 #define MAX 7 3 4 int main(void) 5 { 6 int i, j, t; 7 int a[MAX] = {1, 5, 3, 7, 6, 4, 2}; 8 9 //冒泡排序核心部分 10 for (i = 0; i < MAX - 1; i++) //n个数排序只需要n-1趟 11 { 12 for (j = 0;j < MAX - i; j++) //每一趟比较到n-i结束 13 { 14 if (a[j] < a[j + 1])//降序排列 15 { 16 t = a[j]; 17 a[j] = a[j + 1]; 18 a[j + 1] = t; 19 20 } 21

排序一 冒泡排序

泪湿孤枕 提交于 2020-01-16 11:10:04
目录 要点   算法思想 算法分析   冒泡排序算法的性能   时间复杂度   算法稳定性 优化 完整参考代码   JAVA版本 参考资料 相关阅读 要点 冒泡排序是一种 交换排序 。 什么是交换排序呢? 交换排序 :两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。 算法思想 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。 假设有一个大小为 N 的无序序列。冒泡排序就是要 每趟排序过程中通过两两比较,找到第 i 个小(大)的元素,将其往上排 。 图 - 冒泡排序示例图 以上图为例,演示一下冒泡排序的实际流程: 假设有一个无序序列 { 4. 3. 1. 2, 5 } 第一趟排序:通过两两比较,找到第一小的数值 1 ,将其放在序列的第一位。 第二趟排序:通过两两比较,找到第二小的数值 2 ,将其放在序列的第二位。 第三趟排序:通过两两比较,找到第三小的数值 3 ,将其放在序列的第三位。 至此,所有元素已经有序,排序结束。 要将以上流程转化为代码,我们需要像机器一样去思考,不然编译器可看不懂。 假设要对一个大小为 N 的无序序列进行升序排序(即从小到大)。 (1)

冒泡排序&&选择排序 以及时间效率对比

感情迁移 提交于 2020-01-16 11:07:03
1 package com.test4; 2 import java.util.*; //Calendar 显示时间 3 /** 4 * @author qingfeng 5 * 功能:冒泡排序 6 */ 7 public class Bubble { 8 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 //int arr[] = {10,1,-20,89,-1,78,-45}; 12 13 //随机产生大量数据 14 15 int len = 50000; 16 int[] arr = new int[len]; 17 18 19 for(int i=0; i<len; i++) 20 { 21 //产生1到1000的数 22 arr[i] = (int)(Math.random()*1000); 23 } 24 /* 25 for(int i=0; i<len; i++) 26 { 27 System.out.print(arr[i]+" "); 28 } 29 System.out.println(); 30 */ 31 BubbleSort bs = new BubbleSort(); 32 //显示排序前的时间 33 Calendar time =

常用的十大排序算法,经典图解版,『精』!!!

倾然丶 夕夏残阳落幕 提交于 2020-01-16 08:33:26
前言 本文或许是东半球分析十大排序算法最好的一篇文章,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。 预计阅读时间 47 分钟,强烈建议先收藏然后通过电脑端进行阅读。 No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的

【一周一算法】小哼买书

筅森魡賤 提交于 2020-01-16 05:37:25
之前讲了三种常用的经典排序。排序算法还有很多,例如选择排序、计数排序、基数排序、插入排序、归并排序和堆排序等等。堆排序是基于二叉树的排序,以后再说吧。先分享一个超酷的排序算法的视频。 再来看一个具体的例子《小哼买书》来看看三个排序在应用上的区别和局限性。 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的ISBN号(你知道吗?每本书都有唯一的ISBN号,不信话你去找本书翻到背面看看)。当然有一些好书会有很多同学都喜欢,这样就会收集到很多重复的ISBN号。小哼需要去掉其中重复的ISBN号,即每个ISBN号只保留一个,也就说同样的书只买一本(学校真是够抠门的)。然后再把这些ISBN号从小到大排序,小哼将按照排序好的ISBN号去书店去买书。请你协助小哼完成“去重”与“排序”的工作。 输入有2行,第1行为一个正整数,表示有n个同学参与调查(n<=100)。第2行有n个用空格隔开的正整数,为每本图书的ISBN号(假设图书的ISBN号在1~1000之间)。 输出也是2行,第1行为一个正整数k,表示需要买多少本书。第2行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书ISBN号。 例如输入 10 20 40 32 67 40 20 89 300 400 15 则输出 8 15 20 32 40 67 89 300

冒泡排序的优化

混江龙づ霸主 提交于 2020-01-15 19:00:14
怀疑 冒泡排序的优化? 没听错把? 好吧,此前我还真不知道这玩意儿,也没想过,不过了解之后其实并不复杂。 不过一个O(n2)的算法有啥好优化的呢?快排他不香么?非要去优化一个O(n2)的玩意儿。 好吧,不管,就当脑经急转弯了、 原始冒泡 思路 冒泡冒泡,顾名思义,一杯水,最底下的泡泡,往上浮,最底下最小,越往上越大,像极了冒泡排序; 过程 乱序的N个数(假设要求从左到右从小到大排序),从左到右扫描一遍,每扫描一次,将它本身和它相邻的数进行比较并考虑是否互换位置,每次扫描完毕,你要保证当前这个数和相邻的数是有序的(左小右大),如此第一次扫描完这N个数,你就能发现第N个数是最大的; 然后你再重复这个过程: 第二次只要扫描剩下的N-1个数,你就能发现第N-1个数是最大的; … 以此类推 思考与优化一 思路 想像以下,如果第二次扫描的时候,剩下的N-1个数都已经是有序的呢? 那么往后的扫描次数是不是都是多余的嘞? 过程 如此,你可以设置一个标记,用于假设当前剩下的N-1个数都是有序的了,如果实际在扫描过程中出现了不是有序的情况,就改变这个标记的状态,如果扫描过程中没有发生不是有序的情况,那么说明剩下的全是有序的元素,直接剩下的所有扫描过程即可。 最坏情况分析 对于冒泡来说,最坏的情况无非是:你想要的从左到右有序递增,但是给出的序列是元素从左到右有序递减。 在这种情况下

快速排序与冒泡排序的效率对比

▼魔方 西西 提交于 2020-01-15 08:54:08
快速排序与冒泡排序的效率对比 鄙人在这里谈一下自己对冒泡排序与快速排序的看法,在经过详细的浏览代码以及文章后,我们可以得出以下结论: 1 快速排序是冒泡排序的一种改进,跟冒泡排序有一定的区别。 2. 首先快速排序是选取一个基准数值(数值可以是任何数字),然后在与其他的数字进行比较,比基准数大的放在基准数的左边女,比基准数小的放在右边,与基准数相等的可以任意放置。 3. 把基准数分成两个数列,然后在将两个数列进行比较。 来源: CSDN 作者: ghijrf 链接: https://blog.csdn.net/ghijrf/article/details/103787006

leetcode-1, 两数之和

怎甘沉沦 提交于 2020-01-15 00:54:42
文章目录 一 题目 二 题解 1. 冒泡排序 哈希表查找 三 知识点 数组的初始化 一 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 二 题解 1. 冒泡排序 最简单、直接的解法。 class Solution { public int [ ] twoSum ( int [ ] nums , int target ) { for ( int i = 0 ; i < nums . length ; i ++ ) { for ( int j = 0 ; j < nums . length ; j ++ ) { if ( nums [ i ] + nums [ j ] == target ) { if ( i == j ) { //因为题目中的要求不能使用重复数据的 break ; } System . out . println ( "answer is :" + i + " " + j ) ; int ans [ ] = { i , j } ;