大神总结的很好。学而时习之,善于总结。
//非常恨那些把算法排序之类的搞得异常麻烦的人, 尽可能简单一点, 简单了, 容易理解了, 才好记, 上了战场, 才用得着.
//人家的不好用, 只好自己总结, 重写原理与过程.^_^
//口诀:
//冒泡: N-1, N-i-1, 比的是j与j+1
//插入: N-1, i+1, 比的是i+1与j
//选择: N, N, 开始变成i+1, 比的却是i与j
package com.yenange.sort;
/**
* 三种最常见的排序
*/
public class SortNumber {
public static void main(String[] args) {
int[] arr={7,3,1,5,2,4,6}; //原数组
printArr(arr); //输出
bubbleSort(arr);
insertSort(arr);
selectSort(arr);
printArr(arr);
}
/**
* 1.冒泡排序
* @param arr
* 原理:从底层的元素开始, 用它和它紧挨着的元素相比较, 如果下面的元素(下标较小的)大于上面的元素,
* 就交换它们,否则保持原样.然后转到上一层的元素, 重复上面的过程, 最后, 最大的元素位于下标最大处
* 这时呢, 重复上面的冒泡过程, 因为最大的已经出来了(不需要比最后那一个了), 所以这一次的循环就应
* 该比上次要少一次.c#p327
* ***
* **
* *
*/
private static void bubbleSort (int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
/**
* 2.插入排序
* @param arr
* 原理:抽出牌, 在前面的牌中寻找相应的位置插入, 然后下一张. 一组数字中的每个元素在经过检查后,
* 放入已排序的元素列表中的适当位置. 当最后一个数字放入合适位置时, 该组数据排序完毕.
* 那它与冒泡有什么区别呢?
* 冒泡的比较过程中, 两个相邻元素比较,依次往上走. 内循环中,参与比较没有固定的元素.
* 插入则是抽出本次循环中的最后一个元素, 与它前面的元素相比较, 比较的过程中, 有一个元素是固定的
* 冒泡比较是越比较越少, 插入排序是越比较越多.
* *
* **
* ***
*/
private static void insertSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < i+1; j++) {
if(arr[i+1]<arr[j]){
int temp=arr[i+1];
arr[i+1]=arr[j];
arr[j]=temp;
}
}
}
}
/**
* 3.选择排序
* @param arr
* 原理:类似人的排序习惯, 从数组中选择最小的同第一个交换, 再从余下的部分选择最小的与第二个交换,
* 这样下去, 直到所有的元素排序.
* 与冒泡的区别:
* 冒泡:一次内循环把排序好的元素是在最后;
* 选择:前面;
* 其实与冒泡好像没有多大区别了.只不过是冒泡的翻版.
* ***
* **
* *
*/
public static void selectSort(int[] arr){
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length; j++) {
if (arr[i]>arr[j]) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
/**
* 打印数组内容
* @param arr
*/
private static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"/t");
}
System.out.println();
}
}