3种顺序排序方法。简单排序是指时间复杂度为O(n^2)的排序方法。

3种顺序排序方法。简单排序是指时间复杂度为O(n^2)的排序方法。

1)选择排序

将某个特定值有序的放置在最终位置上---外层循环控制最终位置的序号,内层循环从外层循环序号处向后遍历,找到最小值。

2)插入排序

插入排序将某个特定值插入到值列的某个子集中,并重复该过程---外层循环控制要插入的数据(从第二个数到最后一个),内层循环控制前面已排好序的的值后移。

3)冒泡排序

重复比较相邻的两个元素,并在必要的时候交换双方位置。---外层循环控制每次冒泡到达的最终位置,内层循环交换元素

4)其他:这里写的是一个通用的排序算法,不光是对数值排序,可以对对象排序。对象实现Comparable接口,对象就可以参与比较进行排序。

在对对象进行排序的方法中,就可以调用对象的public int compareTo(Object other)方法来比较对象的先后顺序。


一个可以比较先后顺寻的Student类(按照score大小顺序):

复制代码
   
   
class Student implements Comparable{

private String name;
private double score;

public Student(String name, double score)
{
this .name = name;
this .score = score;
}


public int compareTo(Object other) {
int result;
if (score > ((Student) other).score)
return 1 ;
else if (score < ((Student) other).score)
return - 1 ;
return 0 ;
}


public String toString(){
String result
= "" ;
result
= name + " " + score;
return result;
}

}
复制代码


三种排序方法:

复制代码
   
   
1 package Sort;
2
3   public class SimpleSort {
4
5
6 public static void main(String[] args) {
7
8 Student[] student = new Student[ 7 ];
9
10 student[ 0 ] = new Student( " aa " , 90.32 );
11 student[ 1 ] = new Student( " bb " , 70.32 );
12 student[ 2 ] = new Student( " cc " , 85.32 );
13 student[ 3 ] = new Student( " dd " , 64.32 );
14 student[ 4 ] = new Student( " ee " , 91.32 );
15 student[ 5 ] = new Student( " ff " , 74.32 );
16 student[ 6 ] = new Student( " gg " , 79.32 );
17
18 // selectionSort(student);
19   insertSort(student);
20 // bubbleSort(student);
21  
22 for ( int i = 0 ;i < student.length;i ++ )
23 System.out.println(student[i]);
24 }
25
26
27 // 选择排序
28   public static void selectionSort(Comparable[] data){
29
30 int min; // 用min标识最小元素的下标
31   Comparable temp;
32 for ( int index = 0 ;index < data.length - 1 ;index ++ ){ // 外层循环控制每个位置得到一个最终的值
33   min = index;
34 for ( int scan = index + 1 ;scan < data.length;scan ++ ) // 内层循环从外层循环位置处向后扫描
35 if (data[scan].compareTo(data[min]) < 0 )
36 min = scan; // 只记录位置!!!!
37 // 内层for循环完表明一个位置的元素已经选好,交换
38 temp = data[min];
39 data[min] = data[index];
40 data[index] = temp;
41 }
42 }
43
44
45 // 插入排序
46 public static void insertSort(Comparable[] data){
47
48 for ( int index = 1 ;index <= data.length - 1 ;index ++ ) // 外层循环控制每个待插入元素
49 {
50 Comparable key = data[index]; // 待插入元素
51 int position = index; // 用position记录插入后的应该占领位置(如果不发生改变,初试值是它自己的位置)
52
53 // 只记录应该插入的位置,最后一步赋值。!!!
54 // while(data[position-1].compareTo(key) > 0 && position > 0)
55 while (position > 0 && data[position - 1 ].compareTo(key) > 0 )
56 {
57 data[position] = data[position - 1 ];
58 position -- ;
59 }
60 data[position] = key;
61 }
62 }
63
64
65 // 冒泡排序
66 public static void bubbleSort(Comparable[] data){
67
68 int position,scan;
69 Comparable temp;
70 for (position = data.length - 1 ;position >= 0 ;position -- ) // 外层循环控制每趟冒泡到的最终位置
71 {
72 for (scan = 0 ;scan <= position - 1 ;scan ++ ) // 内层循环不断交换相邻两个元素
73 {
74 if (data[scan].compareTo(data[scan + 1 ]) > 0 )
75 {
76 temp = data[scan];
77 data[scan] = data[scan + 1 ];
78 data[scan + 1 ] = temp;
79 }
80 }
81 }
82 }
83
84 }
复制代码


注意插入排序的内层循环开始写成了这样while(data[position-1].compareTo(key) > 0 && position > 0),运行起来会导致数组越界的异常。且表达式的判断要把最先决条件放在前面,这一点容易忽略。


运行结果,将数组重新排列了---

dd  64.32

bb  70.32

ff  74.32

gg  79.32

cc  85.32

aa  90.32

ee  91.32

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值