这年头你要是不会几种排序算法,都不好意思说自己是搞编程的…
言归正传
PS:通往罗马的路不止一条,方法不唯一。
1.冒泡排序
原理
升序 :第i个元素与第i+1个元素比较,如果第i个元素比第i+1个大,则交换他们的位置。接着继续比较第i+1个与第i+2个元素,如果第i+1个比第i+2个大,则交换他们的位置….直到最后一个元素
这样一趟比较交换下来之后,排在最右的元素就会是最大的数。
除去队列最右边的元素,我们对剩余的元素做同样的操作,直到排序完成。共执行n-1趟(n为元素的个数)
降序:原理与升序相同,将升序原理中的黄色字体“大”变为”小“即可。
PS:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次
示例代码(java语言)
static int[] BubbleSort(int arr[]) {
// 数组为空、长度为1并不需要排序
if (arr == null || arr.length < 2) {
return arr;
}
/*
* 一共n-1趟
*
* i躺比较n-i次
*/
for (int i = 0; i < arr.length; i++) {
/*
* 改善冒泡排序
*
* 当某一趟遍历后,数并无交换时,则认为排序完成,不必继续冗余操作(break)
*/
boolean overFlag = true;// 结束循环符号
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j + 1] < arr[j]) {
overFlag = false;// 有数进行交换,则不结束循环
int temp = arr[j];// temp为交换临时数
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
// 一趟下来是否发生位置交换、不交换则排序完成
if (overFlag)
break;
}
return arr;
}
2.插入排序
原理
升序和降序与冒泡排序类似,不加说明
从队列第2个元素开始,与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。
继续选取第3,4,….n个元素,重复上述步骤 ,插入所在位置。
示例代码(java语言)
static int[] insertSort(int[] arr) {
// 数组为空、长度为1并不需要排序
if (arr == null || arr.length < 2) {
return arr;
}
/*
* 从第二个元素开始,找到那个不大于自己的元素,插在其后面。
*/
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];// 当前元素
int k = i - 1;// k代表当前元素左边的元素
/*
* 左边的的元素存在且左边的元素大于自己,则比较下一个(左移)
*/
while (k >= 0 && arr[k] > temp) {
k--;// 左移
}
/*
* 此时的k就是不大于自己的元素的位置
*/
// 位置k右边的元素向右移动一位,让当前元素插进k+1的位置;
for (int j = i; j > k + 1; j--) {
arr[j] = arr[j - 1];// 位置k右边的元素向右移动一位
}
// 插到属于自己的位置,位置k的右边
arr[k + 1] = temp;
}
return arr;
}
完整源代码
package test.sort;
import java.util.Arrays;
import java.util.Random;
public class Sort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = new Random().nextInt(100) + 1;// 1到100之间的随机数
}
System.out.println("原数组:" + Arrays.toString(arr));
System.out.println("冒泡排序后的数组:" + Arrays.toString(insertSort(arr)));
// System.out.println("冒泡排序后的数组:" + Arrays.toString(BubbleSort(arr)));
}
static int[] BubbleSort(int arr[]) {
// 数组为空、长度为1并不需要排序
if (arr == null || arr.length < 2) {
return arr;
}
/*
* 一共n-1趟
*
* i躺比较n-i次
*/
for (int i = 0; i < arr.length; i++) {
/*
* 改善冒泡排序
*
* 当某一趟遍历后,数并无交换时,则认为排序完成,不必继续冗余操作(break)
*/
boolean overFlag = true;// 结束循环符号
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j + 1] < arr[j]) {
overFlag = false;// 有数进行交换,则不结束循环
int temp = arr[j];// temp为交换临时数
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
// 一趟下来是否发生位置交换、不交换则排序完成
if (overFlag)
break;
}
return arr;
}
static int[] insertSort(int[] arr) {
// 数组为空、长度为1并不需要排序
if (arr == null || arr.length < 2) {
return arr;
}
/*
* 从第二个元素开始,找到那个不大于自己的元素,插在其后面。
*/
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];// 当前元素
int k = i - 1;// k代表当前元素左边的元素
/*
* 左边的的元素存在且左边的元素大于自己,则比较下一个(左移)
*/
while (k >= 0 && arr[k] > temp) {
k--;// 左移
}
/*
* 此时的k就是不大于自己的元素的位置
*/
// 位置k右边的元素向右移动一位,让当前元素插进k+1的位置;
for (int j = i; j > k + 1; j--) {
arr[j] = arr[j - 1];// 位置k右边的元素向右移动一位
}
// 插到属于自己的位置,位置k的右边
arr[k + 1] = temp;
}
return arr;
}
}