1.冒泡排序
package com.lyc.BubbleSort;
/**
* 冒泡排序,從小到大排序,時間複雜度爲O(N^2)
* 原理:比較相鄰兩個元素,如果前一個元素比後一個元素大,則交換這兩個元素的值
* 對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。
* 最終最後的位置就是最大值。
* @author lyc
* @create 2020-04-14 14:38
*/
public class BubbleSort {
/*
對數組a中元素進行排序
*/
public static void sort(Comparable[] a){
/*for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(greater(a[j],a[j+1])){
exch(a,j,j+1);
}
}
}*/
for (int i = a.length-1; i >0 ; i--) {
for (int j=0;j<i;j++){
if(greater(a[j],a[j+1])){
exch(a,j,j+1);
}
}
}
}
/*
比較v元素是否大於w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
交換a數組中索引i和j處的值
*/
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
}
2.選擇排序
package com.lyc.selectionSort;
/**
* 選擇排序,時間複雜度O(N^2)
* 原理:1.每一次遍歷的過程中,都假定第一個索引處的元素是最小值,和其他索引處的值
* 依次進行比較,如果當前索引處的值大於其他索引處的值,則假定其他索引處的
* 值爲最小值,最後可以找到最小值所在的索引。
* 2.交換第一個索引處和最小值所在的索引處的值。
* @author lyc
* @create 2020-04-14 15:07
*/
public class SelectionSort {
/*
對數組a中元素進行排序
*/
public static void sort(Comparable[] a){
for(int i=0;i<a.length-1;i++){
//假定本次遍歷,最小值所在的索引是i
int minIndex=i;
for(int j=i+1;j<a.length;j++){
if(greater(a[minIndex],a[j])){
//更換最小值所在索引
minIndex=j;
}
}
//交換i和minIndex處的值
exch(a,minIndex,i);
}
}
/*
比較v元素是否大於w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
交換a數組中索引i和j處的值
*/
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
}
3.插入排序
package com.lyc.InsertionSort;
/**
* 插入排序 ,時間複雜度O(N^2)
* 原理:1.把所有的元素分爲兩組,已經排序的和未排序的;
* 2.找到未排序的組中的第一個元素,向已經排序的組中進行插入;
* 3.倒敘遍歷已經排序的元素,依次和待插入的元素進行比較,直到
* 找到一個元素小於等於待插入元素,那麼就把待插入元素放到這個
* 位置,其他元素向後移動一位。
* @author lyc
* @create 2020-04-14 15:51
*/
public class InsertionSort {
public static void sort(Comparable[] a){
/*
對數組a中的元素進行排序
*/
for (int i=1;i<a.length;i++){
//當前元素爲a[i],依次和前面的元素比較,找到一個小於等於a[i]的元素
for(int j=i;j>0;j--){
if (greater(a[j-1],a[j])){
//交換元素
exch(a,j-1,j);
}else{
//找到該元素,結束
break;
}
}
}
}
/*
比較v元素是否大於w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
交換a數組中索引i和j處的值
*/
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
}
4.希爾排序
package com.lyc.InsertionSort;
/**
* 插入排序 ,時間複雜度O(N^2)
* 原理:1.把所有的元素分爲兩組,已經排序的和未排序的;
* 2.找到未排序的組中的第一個元素,向已經排序的組中進行插入;
* 3.倒敘遍歷已經排序的元素,依次和待插入的元素進行比較,直到
* 找到一個元素小於等於待插入元素,那麼就把待插入元素放到這個
* 位置,其他元素向後移動一位。
* @author lyc
* @create 2020-04-14 15:51
*/
public class InsertionSort {
public static void sort(Comparable[] a){
/*
對數組a中的元素進行排序
*/
for (int i=1;i<a.length;i++){
//當前元素爲a[i],依次和前面的元素比較,找到一個小於等於a[i]的元素
for(int j=i;j>0;j--){
if (greater(a[j-1],a[j])){
//交換元素
exch(a,j-1,j);
}else{
//找到該元素,結束
break;
}
}
}
}
/*
比較v元素是否大於w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
交換a數組中索引i和j處的值
*/
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
}
未完待續。。。