数组排序算法
常用的排序算法包括三类:
- 冒泡排序
- 直接选择排序
- 反转排序
下边我们就先介绍一下冒泡排序:
1.冒泡排序
特性:思想和实现方法简洁。
基本原理:将相邻的两个值相比较,满足条件就交换元素所在位置,将元素按顺序一个个交换,像气泡冒出一样,慢慢的浮出水面。
算法构思:冒泡算法由双层循环实现,其中外层循环用于控制排序轮数,一般为要排序的数组长度减一;内层循环主要判断每个临近元素的大小,用以确定是否交换位置,对比和交换次数随排序的轮数减少而减少。第一轮循环将最值移到了最外层,,第二轮外层循环将对比出最值外的其他元素(最值已经确认为最大所以忽略),决出剩余元素的最值;以此为循环,最终完成排序任务后输出。
算法实现:
创建一个类,将其中的数组按照冒泡排序排列并输出,实例代码如下:
public class BubbleSort {
public static void main(String[] args) {
int arr[]= new int[] {3,12,34,45,55,11};
BubbleSort sorter =new BubbleSort();
sorter.sort(arr);
}
public void sort(int[] arr) {
for(int i=1;i<arr.length;i++) {
for(int j=1;j<arr.length-i;j++) {
if (arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
showArray(arr);
}
public void showArray(int[] arr) {
for(int i:arr) {
System.out.print(">"+i);
}
System.out.println();
}
}
运行结果如下:
此结果符合冒泡排序思想:将两个相邻的元素进行比较,如满足一定条件则进行交换(如判断大小或者日期前后等),每次循环都将最大(或最小)的元素排在最后,下一次循环是对数组中其他元素进行类似操作;
2.直接选择排序:
特点:
它的排序速度要比冒泡排序快一些,也是常用的排序算法。
算法构思:
将指定排序位置与其他数组元素分别对比,满足条件就交换元素。然后排序好的位置一个一个递增,直至全部排序标准;
与冒泡排序的区别:不是交换相邻元素,而是将满足条件的元素用于指定位置的排序位置交换。(用一个元素比较全部的数,先确定一个最值而后继续排序)
算法实现:
创建一个数组,将数组内的元素用直接选择排序法进行排序,示例代码如下:
public class SelectSort {
public static void main(String[] args) {
int arr[]=new int[] {77,33,44,66,55,22};
SelectSort sorter=new SelectSort();
sorter.sort(arr);
}
public void sort(int[]arr) {
int index;
for(int i=1;i<arr.length;i++) {
index=0;
for(int j=1;j<=arr.length-i;j++) {
if(arr[j]>arr[index]) {
index=j;
}
}
int temp=arr[arr.length-i];
arr[arr.length-i]=arr[index];
arr[index]=temp;
}
showArray(arr);
}
public void showArray(int[]arr) {
for (int i:arr) {
System.out.print(">"+i);
}
System.out.println();
}
}
输出结果如下:
、
反转排序:
概念:以相反的顺序八原有数组的内容重新排列。
算法构思:将数组的最后一个元素与第一个元素替换,倒数第二个元素与第一个元素替换,倒数第二个元素与第二个元素替换。,因为是对数组两边的元素进行替换,所以只需要循环数组长度的半数次即可。
算法实现:
创建一个数组,将其元素进行反转排序:
public class ReverseSort {
public static void main(String[] args) {
int arr[]=new int[] {1,2,3,4,5,6};
ReverseSort sorter=new ReverseSort();
sorter.sort(arr);
}
public void sort(int[]arr) {
System.out.println("原本数组元素:");
showArray(arr);
int temp;
int length=arr.length;
for(int i=0;i<length/2;i++) {
temp=arr[i];
arr[i]=arr[length-i-1];
arr[length-i-1]=temp;
}
System.out.println("数组反转后元素:");
showArray(arr);
}
public void showArray(int[]arr) {
for(int i:arr) {
System.out.print("\t"+i);
}
System.out.println();
}
}
结果为: