排序算法第一篇(简单桶排、选择排序、冒泡排序、快速排序)

简单桶排序

 1 /**
 2  * @author: 攻城狮小白
 3  * @creationTime:2017年11月24日 下午10:37:59
 4  * @description: 桶排序(这个不是真正的桶排,真正的桶排比这个稍微复杂些。但是是桶排的思想,就叫它简单桶排吧)
 5  * @questionDesc:一个班上有6名同学,考试成绩如下arr数组(满分10分),如何快速将学生成绩从小到大排列?
 6  */
 7 public class BucketSortDemo {
 8     public void bucketSort(int[] arr){
 9         int[] array = new int[11];
10         for (int i = 0; i < arr.length; i++) {
11             array[arr[i]]++;
12         }
13         System.out.print("简单桶排输出:");
14         for (int i = 0; i < array.length; i++) {
15             for(int j=0; j<array[i]; j++){
16                 System.out.print(i + " ");
17             }
18         }
19     }
20     public static void main(String[] args) {
21         int[] arr = {5,3,9,5,2,8};
22         new BucketSortDemo().bucketSort(arr);;
23     }
24 }

选择排序

 1 import java.util.Arrays;
 2 /**
 3  * @author: 攻城狮小白
 4  * @creationTime:2017年11月24日 下午10:39:06
 5  * @description: 选择排序(此处按照升序实现,降序只需将>改为<即可)
 6  */
 7 public class SelectionSortDemo {
 8     public void selectionSort(int[] arr){
 9         int temp;
10         int n = arr.length;
11         for(int i=0; i<n-1; i++){
12             for(int j=i+1; j<n; j++){
13                 if(arr[i] > arr[j]){
14                     temp = arr[i];
15                     arr[i] = arr[j];
16                     arr[j] = temp;
17                 }
18             }
19         }
20         System.out.println("选择排序输出:" + Arrays.toString(arr));
21     }
22     public static void main(String[] args) {
23         int[] arr = {6,2,1,7,9,3,4,5,0,8};
24         new SelectionSortDemo().selectionSort(arr);
25     }
26 }

冒泡排序

 1 /**
 2  * @author: 攻城狮小白
 3  * @creationTime:2017年11月24日 下午10:38:40
 4  * @description: 冒泡排序(此处按照升序实现,降序只需将>改为<即可)
 5  */
 6 public class BubbleSortDemo {
 7     public void bubbleSort(int[] arr){
 8         int temp;
 9         int n = arr.length;
10         for(int i=0; i<n-1; i++){
11             for(int j=0; j<n-1-i; j++){
12                 if(arr[j] > arr[j+1]){
13                     temp = arr[j];
14                     arr[j] = arr[j+1];
15                     arr[j+1] = temp;
16                 }
17             }
18         }
19         System.out.println("冒泡排序输出:" + Arrays.toString(arr));
20     }
21     public static void main(String[] args) {
22         int[] arr = {6,2,1,7,9,3,4,5,0,8};
23         new BubbleSortDemo().bubbleSort(arr);
24     }
25 }

快速排序

 1 import java.util.Arrays;
 2 /**
 3  * @author: 攻城狮小白
 4  * @creationTime:2017年11月24日 下午10:32:47
 5  * @description: 快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
 6  *                       然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 7  *               通俗的讲:就是在数组中随便选择一个目标数(一般都选arr[0]比较好理解),然后拿两个变量i和j分别放到数组索引的0位置
 8  *                       和length-1的位置,然后将小于目标数的都放到左边,大于目标数的都放到右边,经过该操作后就找到了目标数的
 9  *                       位置,然后将目标数放到该位置。此时原数组就会被目标数分为两个数组,再递归按照上面的步骤进行,最终就能将原
10  *                       整个数组变成有序序列。
11  */
12 public class QuickSortDemo {
13     public void quickSort(int[] arr, int left, int right){
14         if(left>=right){
15             return;
16         }
17         int i = left;
18         int j = right;
19         int target = arr[left];
20         while(i<j){
21             while(arr[j] >= target && j>i){
22                 j--;
23             }
24             while(arr[i] <= target && i<j){
25                 i++;
26             }
27             //一般情况下都是走这个分支,交换两个数的位置,将大于基准数的放后面,小于基准数的放前面
28             if(i != j){
29                 int temp;
30                 temp = arr[j];
31                 arr[j] = arr[i];
32                 arr[i] = temp;
33             }
34         }
35         //跳出上面外层循环的条件就是i刚好等于j,需要将目标数和当前ij所在位置(表示同一个位置)的数进行交换
36         if(i == j){
37             arr[left] = arr[i];
38             arr[i] = target;
39         }
40         quickSort(arr, left, i-1);
41         quickSort(arr, i+1, right);
42     }
43     public static void main(String[] args) {
44         int[] arr =  {6,2,1,7,9,3,4,5,0,8};
45         QuickSortDemo quickSortDemo = new QuickSortDemo();
46         quickSortDemo.quickSort(arr, 0, arr.length-1);
47         System.out.println("快排输出结果:" + Arrays.toString(arr));
48     }
49 }
时间: 2024-11-07 10:52:43

排序算法第一篇(简单桶排、选择排序、冒泡排序、快速排序)的相关文章

排序算法(三)冒泡、选择排序的Python实现及算法优化详解

说在前面 最近一年太忙,博客长草了.近日用Python实现了常用排序算法,供大家参考. Java版本排序算法及优化,请看以前的文章. <排序算法之简单排序(冒泡.选择.插入)> <排序算法(二)堆排序> 1.排序概念 这里不再赘述,请参看前面2篇文章 2.简单排序之冒泡法Python实现及优化 原理图 2.1.基本实现 num_list = [     [1, 9, 8, 5, 6, 7, 4, 3, 2],     [1, 2, 3, 4, 5, 6, 7, 8, 9] ] nu

Java中的基础排序算法(二):简单选择排序、堆排序

参考文章:https://mp.weixin.qq.com/s/VjqZNPg6dAEReAzqZcb_yw 原文链接:www.jianshu.com/p/5e171281a387 原文地址:https://www.cnblogs.com/lotuses/p/11640671.html

常见排序算法详解(冒泡、选择、插入、快速、希尔、归并)

一.排序算法 1.冒泡排序(Bubble Sort) 定义:是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 原理: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

算法效率的分析--【以选择排序与冒泡排序为基础】

在前面我们实现了选择排序与冒泡排序的具体实现,现在我们从数学的角度分析下算法的效率问题: 首先我们把两种排序算法的概念重温一遍: 选择排序:在每一轮中,找出最小的元素放在他最终的位置.挺起来有些别扭,我们举个实例: eg:        8, 5,1, 20, 6, 3 1ed······  1, 5,8, 20, 6, 3 2ed······  1, 3, 8,20, 6,5 3ed······  1, 3,5, 20, 6, 8 4ed······  1, 3,  5, 6,  20,8 5

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

超级具体解读基本排序算法(不看懊悔,带排序演示动画)

排序与我们日常生活中息息相关.比方.我们要从电话簿中找到某个联系人首先会依照姓氏排序.买火车票会依照出发时间或者时长排序.买东西会依照销量或者好评度排序.查找文件会依照改动时间排序等等.在计算机程序设计中,排序和查找也是最主要的算法,非常多其它的算法都是以排序算法为基础,在一般的数据处理或分析中.通常第一步就是进行排序,比方说二分查找.首先要对数据进行排序.在Donald Knuth 的计算机程序设计的艺术这四卷书中.有一卷是专门介绍排序和查找的. 排序的算法有非常多.在维基百科上有这么一个分类

三种线性排序算法(计数、基数、桶排序)的简单实现

一.计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 基本思想: 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将x直接放置在它在最终输出数组中的位置上. 如下图所示: 由于数组中可能有相等的数,在处理时需要注意. 时间复杂度和空间复杂度分析 算法总时间Θ(k + n).当k=O(n)时,计数排序的运行时间是Θ(n). 空间复杂度是O(n+k).需要两个辅助数组:存放排序结果的数组B[n],存放临时结果的

必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序

冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序的示例: 冒泡排序的算法实现如下:[排序后,数组从小到大排列] /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一