周末憋在家里,复习了一下正则表达式,及常用排序算法,再此小写一篇博文,算是这两日的工作报告了,(~_~)....
常见排序算法(一)→冒泡排序
冒泡排序算法的思想:很简单,每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列从父前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了。因此,复杂度在最坏的情况下是O(N ^ 2)
package com.syc.sort;
import java.util.Arrays;
/**
* 冒泡排序
*
* @author Michael
* @time 9:47:21 PM
* @date Sep 23, 2012
*/
public class BubbleSort {
static int[] num = { 1, 21, 4, 3, 56, 65, 33, 67, 2222, 666 };
public static void main(String[] args) {
Arrays.sort(num);
showArray(num);
}
/**
* From min to max(冒泡排序1)
*/
public static void fromMintoMax1() {
// int[] num = { 1, 21, 4, 3, 56, 65, 33, 67, 2222, 666 };
for (int i = 0, len = num.length; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (num[i] > num[j]) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
}
/**
* From min to max(冒泡排序2,已优化)
*/
public static void fromMintoMax2() {
for (int i = 0, len = num.length; i < len; i++) {
int k = i;
for (int j = k + 1; j < len; j++) {
if (num[j] < num[k]) {
k = j;
}
}
if (k != i) {
int temp = num[k];
num[k] = num[i];
num[i] = temp;
}
}
showArray(num);
}
/**
* From min to max(冒泡排序3,已优化,效率较前两种高)
*/
public static void fromMintoMax3() {
int k, temp;
for (int i = 0, len = num.length; i < len; i++) {
k = i;
for (int j = k + 1; j < len; j++) {
if (num[j] < num[k]) {
k = j;
}
}
if (k != i) {
temp = num[k];
num[k] = num[i];
num[i] = temp;
}
}
showArray(num);
}
/**
* From mxx to min(冒泡排序1)
*/
public static void fromMaxtoMin1() {
for (int i = 0, len = num.length; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (num[i] < num[j]) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
showArray(num);
}
/**
* From mxx to min(冒泡排序2,已优化,)
*/
public static void fromMaxtoMin2() {
for (int i = 0, len = num.length; i < len; i++) {
int k = i;
for (int j = k + 1; j < len; j++) {
if (num[j] > num[k]) {
k = j;
}
}
if (k != i) {
int temp = num[k];
num[k] = num[i];
num[i] = temp;
}
}
showArray(num);
}
/**
*
* @param array
*/
public static void showArray(int[] array) {
for (int arr : array) {
System.out.print(arr + " ");
}
System.out.println("");
}
}
常见排序算法(二)→插入排序
插入排序是最简单最直观的排序算法了,它的依据是:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止。
算法的复杂度也是简单的,排序第一个需要1的复杂度,排序第二个需要2的复杂度,因此整个的复杂度就是:
1 + 2 + 3 + …… + N = O(N ^ 2)的复杂度。
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。
最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。
最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。
插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。
因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
Java实现:
package com.syc.sort;
/**
*
* @author Michael
* @time 9:17:30 PM
* @date Sep 23, 2012
*/
public class InsertSort {
/**
*
* @param array
*/
public static void showArray(int[] array) {
for (int arr : array) {
System.out.print(arr + " ");
}
System.out.println("");
}
/**
*
* @param array
*/
public static void insertSort(int[] array) {
int index;
for (int i = 1; i < array.length; i++) {
int currentData = array[i];
for (index = i; (index > 0) && (currentData < array[index - 1]); index--) {
array[index] = array[index - 1];
}
array[index] = currentData;
showArray(array);
}
}
public static void main(String[] args) {
int[] array = { 9, 2, 7, 3 };
insertSort(array);
}
}
---------------