您的位置:首页 > 编程语言 > Java开发

选择排序和插入排序

2016-06-03 13:31 393 查看

选择排序

选择排序的设计思路是每次内层循环找出最小值放在上次最小值的后面来实现排序

算法复杂度:O(N*N)

它的两个鲜明的特点:

1.运行时间和输入没有关系

2.数据移动式最少的,每次交换只改变两个元素的值,交换次数和数组大小是线性关系

代码实现如下:

import edu.princeton.cs.algs4.StdOut;
public class Selection {
public static void sort(Comparable[] a){
int N = a.length;
for(int i = 0;i<N;i++){
int min = i;
for(int j = i;j<N;j++){
if(less(a[j],a[min]))
min = j;
}
exch(a, i, min);
}
}
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void show(Comparable[] a){
for(int i = 0;i<a.length;i++)
StdOut.print(a[i] + " ");
StdOut.println();
}
public static boolean isSorted(Comparable[] a){
for(int i = 1;i<a.length;i++)
if(less(a[i],a[i-1]))
return false;
return true;
}
}


插入排序

插入排序类似于整理桥牌,将一张牌插入到有序牌的适当位置。

适用范围:适用于数组中倒置的数量很少的时候,对部分有序的数组十分 高效,也适合小规模数组

时间复杂度是O(n*n),虽然两中排序方法复杂度都是平方级别的,但是对于随机排序的无重复主键的数组,插入排序稍稍比选择排序快一点因为选择排序在第二重循环时不需要全部遍历数组,而选择排序为了选出最大值或最小值会全部遍历。

代码实现如下:

import edu.princeton.cs.algs4.StdOut;

public class Insertion {
public static void sort(Comparable[] a){
int N = a.length;
for(int i = 1;i<N;i++){
for(int j = i; j>0 && less(a[j],a[j-1]);j--)
exch(a,j,j-1);
}
}
private static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a,int i, int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void show(Comparable[] a){
for(int i = 0;i<a.length;i++)
StdOut.print(a[i] + " ");
StdOut.println();
}
public static boolean isSorted(Comparable[] a){
for(int i = 1;i<a.length;i++)
if(less(a[i],a[i-1]))
return false;
return true;
}
public static void main(String args[]){
String[] a = {"tu", "35", "678", "qg"};
sort(a);
show(a);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息