-
2017-11-13 10:01:58
算法基础复习,选择排序和冒泡排序,做个记录,已备查看。
//冒泡排序 public static void bubbleSort(int[] arr){ for(int i=0;i<arr.length-1;i++){//最多做n-1趟排序 //对当前无序区间进行排序(j的范围很关键,这个范围是在逐步缩小的) for(int j=0;j<arr.length-1-i;j++){ if(arr[j]<arr[j+1]){ //把小的值交换到后面 int temp= arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } //选择排序 public static void sort(int[] arr){ for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]<arr[j]){ int temp= arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } }
更多相关内容 -
直接选择排序和冒泡排序
2020-11-27 23:43:49直接选择排序 直接选择排序是一种简单的排序算法。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有...排序算法
直接选择排序和冒泡排序
一.直接选择排序(Straight Selection Sort)
1、直接选择排序的基本思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态: 无序区为R[1…n],有序区为空。
②第1趟排序
在无序区R[1…n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1…1]和R[2…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1…i-1]和Ri…n。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1…i]和R[i+1…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。2.代码实现:
import java.util.Arrays; public class SortTest { public static void main(String[] args) { // 定义需要升序排序的数组arr int [] arr={8,4,15,2,1}; // 对数组升序排序 for (int i = 0; i < arr.length - 1; i++) { int min = i; // 找出第i个元素之后最小值的索引 for (int j = i + 1; j < arr.length; j++) { if (arr[min] > arr[j]) { min = j; } } // 交换最小值 if (min != i) { int tmp = arr[min]; arr[min] = arr[i]; arr[i] = tmp; } } // 输出排序后的数组,使用java.util.Arrays包下的Arrays类调用toString方法可以打印数组元素 System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 4, 8, 15]
排序过程:
原始数组:8 4 15 2 1 第一次排序结果:1 4 15 2 8。排好了第1位。 第二次排序结果:1 2 15 4 8。排好了第2位。 第三次排序结果:1 2 4 15 8。排好了第3位。 第四次排序结果:1 2 4 8 15。排好了第4位。
3.直接选择排序de稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录, 若经过排序,这些记录的相对次序保持不变, 即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前, 则称这种排序算法是稳定的;否则称为不稳定的。
所以选择排序是一个不稳定的排序算法。
4.时间复杂度分析
第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。
共比较的次数是 (N - 1) + (N - 2) + … + 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2。
舍去最高项系数,其时间复杂度为 O(N^2)。虽然选择排序和冒泡排序的时间复杂度一样,但实际上,选择排序进行的交换操作很少,最多会发生 N - 1次交换。
而冒泡排序最坏的情况下要发生N^2 /2交换操作。从这个意义上讲,交换排序的性能略优于冒泡排序。
而且,交换排序比冒泡排序的思想更加直观。5.例题:使用直接选择排序(按升序)对给定的数组排序,并输出每次排序结果以及排序完成后的数组,具体要求如下
接收给定的数据(如:4 88 43 43 98 #…,其中第一个数代表数组长度,其余数代表数组元素,# 号用于终止接收数据),遇到 # 号终止接收; 创建数组,使用直接选择排序(按升序)对给定的数组排序,并输出每次排序结果以及排序完成后的数组。 注意:数字分隔符为空格。
import java.util.Scanner; import java.util.Arrays; public class SortTest { public static void main(String[] args) { // 请在Begin-End间编写代码 /********** Begin **********/ // 接收给定数据 Scanner input = new Scanner(System.in); int n = input.nextInt(); // 定义数组 int a[] = new int [n]; // 给数组赋值 for(int i=0;i<n;i++){ a[i]=input.nextInt(); } // 使用直接选择排序法对数组升序排序,并输出每次排序的结果 int count=0; for(int i=0;i<a.length-1;i++){ int min =i; for(int j=i+1;j<a.length;j++){ if(a[min]>a[j]){ min = j; } } if(min!=i){ int t = a[min]; a[min]=a[i]; a[i]=t; } count++; System.out.println("第"+count+"次排序:"+Arrays.toString(a)); } // 输出排序后的数组 System.out.println("排序后的结果为:"+Arrays.toString(a)); /********** End **********/ } }
测试输入:9 1 6 53 54 2 89 54 90 21 #
—— 预期输出 ——
第1次排序:[1, 6, 53, 54, 2, 89, 54, 90, 21]
第2次排序:[1, 2, 53, 54, 6, 89, 54, 90, 21]
第3次排序:[1, 2, 6, 54, 53, 89, 54, 90, 21]
第4次排序:[1, 2, 6, 21, 53, 89, 54, 90, 54]
第5次排序:[1, 2, 6, 21, 53, 89, 54, 90, 54]
第6次排序:[1, 2, 6, 21, 53, 54, 89, 90, 54]
第7次排序:[1, 2, 6, 21, 53, 54, 54, 90, 89]
第8次排序:[1, 2, 6, 21, 53, 54, 54, 89, 90]
排序后的结果为:[1, 2, 6, 21, 53, 54, 54, 89, 90]二.冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
1.冒泡排序算法的原理如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3.针对所有的元素重复以上的步骤,除了最后一个。 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2.代码实现:
import java.util.Arrays; public class SortTest { public static void main(String[] args) { // 定义需要升序排序的数组arr int [] arr={8,4,15,2,1}; // 对数组升序排序 for(int i =0;i<arr.length-1;i++) { // 外循环为排序趟数,n个数进行n-1趟 for(int j=0;j<arr.length-1-i;j++) { //内循环为每趟比较的次数,第i趟比较n-i次 if(arr[j]>arr[j+1]) { //相邻元素比较,若逆序则交换(升序为左大于右,降序反之) int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } // 输出排序后的数组,使用java.util.Arrays包下的Arrays类调用toString方法可以打印数组元素 System.out.println(Arrays.toString(arr)); } }
输出结果:
[1, 2, 4, 8, 15]
排序过程:
原始数组:8 4 15 2 1 第一次排序结果:4 8 2 1 15。排好了最后1位。 第二次排序结果:4 2 1 8 15。排好了倒数第2位。 第三次排序结果:2 1 4 8 15。排好了倒数第3位。 第四次排序结果:1 2 4 8 15。排好了倒数第4位。
3.冒泡排序算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
4.时间复杂度
冒泡排序最好的时间复杂度为O(n)
冒泡排序的最坏时间复杂度为O(n²)综上,因此冒泡排序总的平均时间复杂度为 O(n²)
三.直接选择排序和冒泡排序的优缺点
1.冒泡排序
优点是比较简单,空间复杂度较低,是稳定的;缺点是时间复杂度太高,效率慢。
2.选择排序
优点是一轮比较只需要换一次位置;缺点是效率慢,不稳定。
四.总结:
数组全部输出
可以使用java.util.Arrays包下的Arrays类调用toString方法可以打印数组元素 System.out.println(Arrays.toString(arr));
-
Java实现选择排序和冒泡排序
2019-07-20 21:23:47选择排序开始的时候,我们从第一个元素开始扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素和第一个元素交换位置;然后,我们从第二个元素开始扫描剩下的n-1个元素,找到这n-1个元素中的最小元素...1 问题描述
给定一个可排序的n元素序列(例如,数字、字符和字符串),将它们按照非降序方式重新排列。2 解决方案
2.1 选择排序原理简介
选择排序开始的时候,我们从第一个元素开始扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素和第一个元素交换位置;然后,我们从第二个元素开始扫描剩下的n-1个元素,找到这n-1个元素中的最小元素,将最小元素和第二个元素交换位置;然后从第三个元素开始扫描…一般来说,就是从第i个元素开始扫描,找到第n-i+1个元素中的最小元素,将最小元素与第i个元素交换位置。这样,在进行n-1次遍历后,该列表就排好序了。package com.liuzhen.chapterThree; public class SelectionSort { public static void getSelectionSort(int[] a){ int min = 0; //用于存放n-i序列中最小元素序号 int temp = 0; //交换数组元素值的中间变量 //打印输出未排序前数组序列 System.out.print("排序前: "); for(int p = 0;p < a.length;p++) System.out.print(a[p]+"\t"); System.out.println(); for(int i = 0;i < a.length-1;i++){ min = i; for(int j = i+1;j < a.length;j++){ if(a[j] < a[min]) min = j; } //交换a[i]和a[min]的值 temp = a[i]; a[i] = a[min]; a[min] = temp; //打印输出每一次选择排序结果 System.out.print("排序第"+(i+1)+"趟:"); for(int p = 0;p < a.length;p++) System.out.print(a[p]+"\t"); System.out.println(); } } public static void main(String args[]){ int[] a = {89,45,68,90,29,34,17}; getSelectionSort(a); } }
运行结果:
排序前: 89 45 68 90 29 34 17 排序第1趟:17 45 68 90 29 34 89 排序第2趟:17 29 68 90 45 34 89 排序第3趟:17 29 34 90 45 68 89 排序第4趟:17 29 34 45 90 68 89 排序第5趟:17 29 34 45 68 90 89 排序第6趟:17 29 34 45 68 89 90
2.3 冒泡排序原理简介
我们从列表的第一个元素开始,比较列表中相邻的两个元素,如果第一个元素大于第二元素,则交换这两个元素的位置,否则就从第二个元素位置开始重复上一步操作。重复多次以后,最大的元素就“沉到”列表的最后一个位置。这样一直做,直到n-1遍以后,该列表就排好序了。package com.liuzhen.chapterThree; public class BubbleSort { public static void getBubbleSort(int[] a){ int temp; //打印输出未排序前数组序列 System.out.print("排序前: "); for(int p = 0;p < a.length;p++) System.out.print(a[p]+"\t"); System.out.println(); for(int i = 0;i < a.length-1;i++){ for(int j = 0;j < a.length-1-i;j++){ if(a[j+1] < a[j]){ //交换a[j]和a[j+1]的值 temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } //打印输出每一次选择排序结果 System.out.print("排序第"+(i+1)+"趟:"); for(int p = 0;p < a.length;p++) System.out.print(a[p]+"\t"); System.out.println(); } } public static void main(String args[]){ int[] a = {89,45,68,90,29,34,17}; getBubbleSort(a); } }
运行结果:
排序前: 89 45 68 90 29 34 17 排序第1趟:45 68 89 29 34 17 90 排序第2趟:45 68 29 34 17 89 90 排序第3趟:45 29 34 17 68 89 90 排序第4趟:29 34 17 45 68 89 90 排序第5趟:29 17 34 45 68 89 90 排序第6趟:17 29 34 45 68 89 90
-
C++ 简单选择排序和冒泡排序
2018-12-11 17:02:55一 简单选择排序: 排序过程: (1)首先通过n-1次比较,找出n个数中最小的,使它与第一个书交换——第一趟选择排序,这时候最小的元素就在第一个位置了。 (2)再通过n-2次比较,从剩余的n-1个数中找出次小的并与第二个...一 简单选择排序:
排序过程:
(1)首先通过n-1次比较,找出n个数中最小的,使它与第一个书交换——第一趟选择排序,这时候最小的元素就在第一个位置了。
(2)再通过n-2次比较,从剩余的n-1个数中找出次小的并与第二个数交换将它放在第二个元素位置——第二趟选择排序。
(3)重复上述过程,经过n-1次排序后,排序结束。
例如我们对{3,5,7,8,9,6,2,1,4}从小到大排序
第一趟:通过8次比较,找出最小的数1,让他与第一个元素交换,这时候1就调到了第一个元素位置。
这时候序列式{1,3,5,7,8,9,6,2,4}
第二趟:不对1进行比较,比较后面的7个数,将2调到了第二个元素位置。
重复以上操作,最后就实现了从小到大的排序。、
具体代码实现:#include <iostream> using namespace std; int main() { int a[101]; int k,n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n-1;i++) { k=i; for(int j=i+1;j<=n;j++) if(a[k]>a[j])k=j; if(k!=i) { int t; t=a[i]; a[i]=a[k]; a[k]=t; } } for(int i=1;i<=n;i++) cout<<a[i]<<" "; return 0; }
运行结果
程序过程;
首先i=1的时候:5跟4比,4比5小,4和5交换位置,然后4跟3比,3比4小,交换位置,然后3跟2比。2比3小,交换位置,2跟1比,2比1大,交换位置,第一趟排序结束,得到1 5 4 3 2的顺序。
i=2的时候:5跟4比,4跟3比,3跟2比,结束后得到1 2 5 4 3的顺序。
重复以上过程最后i=4的时候 前面3个数是1 2 3 后面是5和4,5和4比,4比5小,交换位置,排序结束得到1 2 3 4 5.
二 冒泡排序
排序过程:
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;以此类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。
(2)对前n-1个数进行第二趟排序,结果次大的数被安置在第n-1个元素位置。
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。
例如:
设n=6,本例a[0]不用,只用a[1]~a[6],定义数组长度为7,即a[7]。
以上是形象的排序过程。
程序实现:#include <iostream> using namespace std; int main() { int a[7]; for(int i=1;i<=6;i++) cin>>a[i]; for(int i=1;i<=6-1;i++) for(int j=1;j<=6-i;j++) if(a[j]>a[j+1]) { int t; t=a[j]; a[j]=a[j+1];
运行结果:
程序过程
第一趟:6与8比,8比6大,不交换位置,然后8与4比;8比4大,交换位置,然后8与9比,8比9小,不交换位置,然后9与2比,交换位置,然后9与3比交换位置,最终最大的数9跑到了最后一个位置。
第二趟:上一趟排序后的顺序为6 4 8 2 3 9 因为9已经是在最后一个位置了 所以第二趟进行四次比较就行 最终将次大的数8移到倒数第二个位置。
重复以上操作,得到顺序2 3 4 6 8 9,排序结束。 -
冒泡排序和选择排序_C语言_冒泡排序_选择排序_
2021-09-29 10:41:551.用单向链表实现简单选择排序方法。假设链表中存储的是整数。2.用单向链表实现冒泡排序方法。假设链表中存储的是整数。 -
冒泡排序&选择排序&插入排序
2020-12-21 22:00:16冒泡排序 选择排序 插入排序 冒泡排序 冒泡排序(最好是O(n), 最坏O(n2)) 原理: 拿自己与上面一个比较,如果上面一个比自己小就将自己和上面一个调换位置,依次再与上面一个比较,第一轮结束后最上面那个一定是... -
冒泡排序和选择排序
2021-07-22 15:59:01概念 时间复杂度:一段程序运行所需要的的时间 ...举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6和4无需交换。6和 -
C语言冒泡排序和选择排序
2022-01-05 10:14:49一、冒泡排序法 假设从小到大排序,例一数组:int arr[] = {2,1,34,5}。 arr[0]元素先跟相邻的arr[1]元素相比,如果比它大则交换两个元素,大的数值放在后面。然后比较arr[1]和arr[2]的大小,以此类推,直至第n-2... -
选择排序与冒泡排序的区别(python案例)
2022-03-03 15:08:06选择排序:对于arr[0],遍历至多n-1次,可以找到比arr[0]的数更小的数arr[i],则交换两者位置,若最小的数既是本身,则无需交换。相当于从数组中找到最小的值并将其放置于数组首位,然后在找次小的数放在第二位,... -
python中常见的排序:选择排序,冒泡排序
2021-11-14 17:55:091、选择排序: 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小的元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已... -
Java利用选择排序和冒泡排序实现对键盘录入的数据排序
2020-07-03 14:31:37Java利用选择排序和冒泡排序实现对键盘录入的数据排序 -
直接插入排序 、冒泡排序、简单选择排序
2021-05-23 19:22:48直接插入排序 、冒泡排序、简单选择排序 -
选择排序法和冒泡排序法
2020-05-21 17:00:57选择排序法和冒泡排序法 1.选择排序法 #include<stdio.h> int main() { void sort(int a[],int n); int i,a[10]; printf("please input the original array:"); for(i=0;i<10;i++) scanf("%d",&a... -
简单选择排序和冒泡排序
2017-07-03 20:52:08简单选择排序和冒泡排序关于排序,冒泡排序和简单选择排序应该是最简单的排序了冒泡排序排序过程:从小到大排序比较第一个与第二个数,若a[0]>a[1], 则交换; 然后比较第二个数和第三个数; 以此类推, 直到第n-1个数和第n... -
c#中选择排序和冒泡排序比较
2017-07-30 17:14:08//冒泡排序 冒泡排序需要双循环一个是趟数 一个是循环次数 int [] array ={12,22,11,21,32,25,26,70}; int temp; for(int i = 1; i for(int j =1; j if(array[j-1]>array[j]){ temp = array[j-1]; -
总结c语言基础算法——冒泡排序法和选择排序法
2022-03-16 12:51:04而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法——冒泡排序法和选择排序法。 下面将举一个例子进行讲解: 要求:从键盘输出10个整数,要求对它们按照从小到大的顺序排列。 ... -
冒泡排序和简单选择排序c语言
2018-03-14 19:29:00冒泡排序 简单选择排序 c语言基础 排序算法 数组操作 排序算法实验 简单的c语言程序 排序算法输出 -
Python选择排序、冒泡排序、合并排序代码实例
2020-09-22 06:18:27主要介绍了Python选择排序、冒泡排序、合并排序代码实例,本文直接给出实现代码,需要的朋友可以参考下 -
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
2021-07-23 21:56:09插入排序2.希尔排序 1. 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已... -
Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法
2020-12-31 06:16:06排序算法有许多种,这里介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例。 一、冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,... -
冒泡排序和选择排序的区别
2021-09-01 20:15:261.冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值; 2.冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置; 3.冒泡排序是通过数去找位置,选择... -
java实现选择排序和冒泡排序及执行流程图解
2016-08-04 21:59:481、 选择排序:把第一个数与他后面的数进行比较,如果顺序则继续与后面比较,如果逆序则两数交换位置,继续将第一个数与交换位置后的数进行比较,这样就完成了第一轮排序。同理将第二位与其后的数比较,直到数组有序... -
排序——选择排序、冒泡排序和快速排序比较
2018-06-16 15:59:08一、冒泡排序思路:1、以 int 类型为例2、拿第一个数与后面数相比较,如果比后面的数大则交换3、拿第二个数与后面的数比较,如果比后面的数大则交换4、直到比较到倒数第二个数,最后一个数不用比较5、两个数比较可以... -
冒泡排序算法和选择排序算法比较
2021-05-09 11:55:39冒泡排序算法和选择排序算法的区别: 冒泡排序是比较相邻位置的两个数;而选择排序是按顺序比较,找出最大值或者最小值。 冒泡排序扫描一遍数组,位置不对需要不停地互换位置;而选择排序扫描一遍数组,只需要... -
Java中的选择排序和冒泡排序思想及代码实现
2017-12-13 13:22:12选择排序基本思想(假设获取数组中的最大值): 初始化一个数组:int[] array={n个数据} 第1次排序:将索引为0的元素取出来,用该元素与之后的每一个元素做比较,比该元素小则不动,比该元素大则交换二者的数值,... -
直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较)
2016-03-20 15:36:42数据结构---直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较) -
冒泡排序、选择排序和插入排序的区别
2018-07-04 11:28:04这三种排序的时间级别: 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0——N2/2 = N2/4 总时间 3/4*N2 选择排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0——3*(N-1)=3*(N-1... -
冒泡排序_冒泡排序_
2021-09-30 06:07:15C++实现冒泡排序,多层次,快速实现排序算法