选择排序、插入、希尔排序,是最基本的排序算法。原理简单,实现容易
选择排序的原理是,把一个待排序数组看成是未排序部分,与有序部分,每次在未排序部分选择最大(小)的元素插入有序部分的最后一个位置,当未排序部分长度为0时,整个数组有序,排序结束。
选择排序:
public class SelectSort {
//sort
public static <T extends Comparable<? super T>> void sort(T [] arr){
int minIndex = 0;
for(int i=0; i<arr.length; i++) {
minIndex = min(arr, i);
ex(arr, i, minIndex);
}
}
//exchange
private static <T extends Comparable<? super T>> void ex(T [] arr, int index1, int index2){
if (index1 == index2 ) return;
T temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
//compare
private static <T extends Comparable<? super T>> int compare(T c1, T c2){
return c1.compareTo(c2);
}
//find min 也可以根据需要改为最大值
private static <T extends Comparable<? super T>> int min(T [] arr, int start){
int minIndex = start;
for (int i=start; i<arr.length; i++) {
if(compare(arr[i], arr[minIndex]) < 0) {
minIndex = i;
}
}
return minIndex;
}
private static <T extends Comparable<? super T>> void print(T [] arr){
System.out.print("array is : ");
for (int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String [] args){
People p1 = new People("mfkcel", 25);
People p2 = new People("mdfdel", 23);
People p3 = new People("dsfsd el", 20);
People p4 = new People("cccl", 15);
People p5 = new People("dddd", 28);
People p6 = new People("eel", 32);
People p7 = new People("cefd", 44);
People p8 = new People("kio", 22);
People p9 = new People("ytu", 8);
People p10 = new People("jhjj", 15);
People [] ps = {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10};
System.out.println("before sort:");
print(ps);
sort(ps);
System.out.println("after sort:");
print(ps);
}
//用于测试的嵌套类
public static class People implements Comparable<People> {
public int age;
public String name;
public People (String name, int age) {
this.name = name;
this.age = age;
}
public int compareTo(People p){
People p1 = (People)p;
if (this.age < p1.age) return -1;
else if(this.age > p1.age) return 1;
else return 0;
}
public String toString(){
return name + ":" + age;
}
}
}
插入排序的原理是,把一个待排序数组看成是未排序部分,与有序部分,每次把未排序部分的第一元素插入有序部分适当位置,当未排序部分长度为0时,整个数组有序,排序结束。
插入排序:
public class InsertSort{
/*
insertsort 2018.3.17
*/
public static void sort (Comparable [] arr) {
int result = 0;
//j=i+1,所以i的取值上限是arr.length-1,数组一定注意它的边界,特别是有多个index时
for (int i=0; i<arr.length-1; i++) {
for (int j=i+1; j>0; j--) {
result = compare(arr[j], arr[j-1]);
if (result >= 0) { break; }
else if (result < 0) { ex(arr, j, j-1); }
}
}
}
//exchange
private static void ex(Comparable [] arr, int index1, int index2){
if (index1 == index2 ) return;
Comparable temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
//compare
private static int compare(Comparable c1, Comparable c2){
return c1.compareTo(c2);
}
private static void print(Comparable [] arr){
System.out.print("array is : ");
for (int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main (String [] args) {
Integer [] arr = {35, 25, 23, 1, 2, 3, 15, 14, 12, 13, 33, 43, 25, 3, 0, 100, 99, 88, 75};
System.out.println("排序前:");
print(arr);
sort(arr);
System.out.println("排序后:");
print(arr);
}
}
希尔排序是插入排序的改进型,在插入算法中每次进行比较的都是紧挨着的元素即每次index都是按1增加的,现在把这个index每次增加的数量变为一定长度这就是希尔排序
希尔排序:
public class ShellSort{
public static void sort (Comparable [] arr) {
int result = 0;
int shellFactor = arr.length / 3;
while (shellFactor > 0) {
for (int i=0; i<arr.length-shellFactor; i+=shellFactor) {
for (int j=i+shellFactor; j>0; j-=shellFactor) {
result = compare(arr[j], arr[j-shellFactor]);
if (result < 0) {
ex(arr, j, j-shellFactor);
} else {
break;
}
}
}
shellFactor--;
}
}
//exchange
private static void ex(Comparable [] arr, int index1, int index2){
if (index1 == index2 ) return;
Comparable temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
//compare
private static int compare(Comparable c1, Comparable c2){
return c1.compareTo(c2);
}
private static void print(Comparable [] arr){
System.out.print("array is : ");
for (int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main (String [] args) {
Integer [] arr = {35, 25, 23, 1, 2, 3, 15, 14, 12, 13, 33, 43, 25, 3, 0, 100, 99, 88, 75};
System.out.println("排序前:");
print(arr);
sort(arr);
System.out.println("排序后:");
print(arr);
}
}