常见的几种排序算法

一、直接插入排序
原理:从待排序的数中选出一个来,插入到前面的合适位置
[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.xtfggef.algo.sort;
  
public class InsertSort {
  
     static int data[] = { 9 , 2 , 7 , 19 , 100 , 97 , 63 , 208 , 55 , 78 };
  
     public static void insertSort() {
         int tmp, j = 0 ;
         for ( int k = 0 ; k < data.length; k++) { //-----1-----
             tmp = data[k];
             j = k - 1 ;
             while (j >= 0 && tmp < data[j]) { //-----2-----
                 data[j + 1 ] = data[j];
                 j--;
             }
             data[j + 1 ] = tmp; //------3-------
         }
     }
  
     public static void main(String[] args) {
         print();
         System.out.println();
         insertSort();
         System.out.println();
         print();
     }
  
     static void print() {
         for ( int i = 0 ; i < data.length; i++) {
             System.out.print(data[i] + " " );
         }
     }
  
}

简单的讲解一下过程:思路上从待排序的数据中选出一个,插入到前面合适的位置,耗时点在插入方面,合适的位置意味着我们需要进行比较找出哪是合适的位置,举个例子:对于9,2,7,19,100,97,63,208,55,78这组数,第一个数9前面没有,不做操作,当第一个数完后,剩下的数就是待排序的数,我们将要从除去9开始的书中选出一个插入到前面合适的位置,拿到2后,放在tmp上,进行注释中的2处的代码,2处的代码就是通过循环找出这个合适的位置,发现比tmp大的数,立即将该数向后移动一位(这样做的目的是:前面需要空出一位来进行插入),最后通过注释3处的代码将数插入。

本排序适合:基本有序的数据


二、选择排序
与直接插入排序正好相反,选择排序是从待排序的数中选出最小的放在已经排好的后面,这个算法选数耗时。
[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.xtfggef.algo.sort;
  
public class SelectSort {
  
     static int data[] = { 9 , 2 , 7 , 19 , 100 , 97 , 63 , 208 , 55 , 78 };
  
     public static void selectSort() {
         int i, j, k, tmp = 0 ;
         for (i = 0 ; i < data.length - 1 ; i++) {
             k = i;
             for (j = i + 1 ; j < data.length; j++)
                 if (data[j] < data[k])
                     k = j;
             if (k != i) {
                 tmp = data[i];
                 data[i] = data[k];
                 data[k] = tmp;
             }
         }
     }
     public static void main(String[] args) {
         print();
         System.out.println();
         selectSort();
         System.out.println();
         print();
     }
  
     static void print() {
         for ( int i = 0 ; i < data.length; i++) {
             System.out.print(data[i] + " " );
         }
     }
  
}

通过循环,找出最小的数的下标,赋值于k,即k永远保持待排序数据中最小的数的下标,最后和当前位置i互换数据即可。


三、快速排序
快速排序简称快排,是一种比较快的排序,适合基本无序的数据,为什么这么说呢?下面说下快排的思路:
设置两个指针:i和j,分别指向第一个和最后一个,i像后移动,j向前移动,选第一个数为标准(一般这样做,当然快排的关键就是这个“标准”的选取),从后面开始,找到第一个比标准小的数,互换位置,然后再从前面,找到第一个比标准大的数,互换位置,第一趟的结果就是标准左边的都小于标准,右边的都大于标准(但不一定有序),分成两拨后,继续递归的使用上述方法,最终有序!代码如下:
 
[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.xtfggef.algo.sort;
  
public class QuickSortTest {
  
     static class QuickSort {
  
         public int data[];
  
         private int partition( int array[], int low, int high) {
             int key = array[low];
             while (low < high) {
                 while (low < high && array[high] >= key)
                     high--;
                 array[low] = array[high];
                 while (low < high && array[low] <= key)
                     low++;
                 array[high] = array[low];
             }
             array[low] = key;
             return low;
         }
  
         public int [] sort( int low, int high) {
             if (low < high) {
                 int result = partition(data, low, high);
                 sort(low, result - 1 );
                 sort(result + 1 , high);
             }
             return data;
         }
     }
  
     static void print( int data[]) {
         for ( int i = 0 ; i < data.length; i++) {
             System.out.print(data[i] + " " );
         }
     }
  
     public static void main(String[] args) {
         int data[] = { 20 , 3 , 10 , 9 , 186 , 99 , 200 , 96 , 3000 };
         print(data);
         System.out.println();
         QuickSort qs = new QuickSort();
         qs.data = data;
         qs.sort( 0 , data.length - 1 );
         print(data);
     }
}


四、冒泡排序
冒泡排序是一种很简单,不论是理解还是时间起来都比较容易的一种排序算法,思路简单:小的数一点一点向前起泡,最终有序。
[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.xtfggef.algo.sort;
  
public class BubbleSort {
  
     static int data[] = { 9 , 2 , 7 , 19 , 100 , 97 , 63 , 208 , 55 , 78 };
  
     public static void bubbleSort() {
         int i, j, tmp = 0 ;
         for (i = 0 ; i < data.length - 1 ; i++) {
             for (j = data.length - 1 ; j > i; j--) {
                 if (data[j] < data[j - 1 ]) {
                     tmp = data[j];
                     data[j] = data[j - 1 ];
                     data[j - 1 ] = tmp;
                 }
             }
         }
     }
  
     public static void main(String[] args) {
         print();
         System.out.println();
         bubbleSort();
         System.out.println();
         print();
     }
  
     static void print() {
         for ( int i = 0 ; i < data.length; i++) {
             System.out.print(data[i] + " " );
         }
     }
  
}
在充满仪式感的生活里,一款能传递心意的小工具总能带来意外惊喜。这款基于Java开发的满屏飘字弹幕工具,正是为热爱生活、乐于分享的你而来——它以简洁优雅的视觉效果,将治愈系文字化作灵动弹幕,在屏幕上缓缓流淌,既可以作为送给心仪之人的浪漫彩蛋,也能成为日常自娱自乐、舒缓心情的小确幸。 作为程序员献给crush的心意之作,工具的设计藏满了细节巧思。开发者基于Swing框架构建图形界面,实现了无边框全屏显示效果,搭配毛玻璃质感的弹幕窗口与圆润边角设计,让文字呈现既柔和又不突兀。弹幕内容精选了30条治愈系文案,从&ldquo;秋天的风很温柔”到&ldquo;你值得所有温柔”,涵盖生活感悟、自我关怀、浪漫告白等多个维度,每一条都能传递温暖力量;同时支持自定义修改文案库,你可以替换成专属情话、纪念文字或趣味梗,让弹幕更具个性化。 在视觉体验上,工具采用柔和色调生成算法,每一条弹幕都拥有独特的清新配色,搭配半透明渐变效果与平滑的移动动画,既不会遮挡屏幕内容,又能营造出灵动治愈的氛围。开发者还优化了弹幕的生成逻辑,支持自定义窗口大小、移动速度、生成间隔等参数,最多可同时显示60条弹幕,且不会造成电脑卡顿;按下任意按键即可快速关闭程序,操作便捷无负担。 对于Java学习者而言,这款工具更是一份优质的实战参考。源码完整展示了Swing图形界面开发、定时器调度、动画绘制、颜色算法等核心技术,注释清晰、结构简洁,哪怕是初学者也能轻松理解。开发者在AI辅助的基础上,反复调试优化细节,解决了透明度控制、弹幕碰撞、资源占用等多个问题,这份&ldquo;踩坑实录”也为同类项目开发提供了宝贵经验。 无论是想给喜欢的人制造浪漫惊喜,用满屏文字传递心意;还是想在工作间隙用治愈文案舒缓压力,或是作为Java学习的实战案例参考,这款满屏飘字弹幕工具都能满足你的需求。它没有复杂的操作流程,无需额外配置环境,下载即可运行,用最纯粹的设计传递最真挚的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值