数组的排序是我们在学习编程的时候常见的问题,如果想要快速的进行排序可以使用数组的工具类Arrays,它里面就有针对数组各种功能实现的方法,包括排序功能(Arrays.sort(传入的数组)),下面使用介绍不用工具类的集中算法实现数组排序功能。
1.冒泡排序:
冒泡排序算法的原理如下:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
//冒泡排序
@Test
public void bubbleSort(){
int[] arr=new int[]{20,44,1,6,8,2};
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;
}
}
}
for (int i : arr) {
System.out.print(i+" ");
}
}
2.选择排序:
选择排序就是不断地从未排序的元素中选择最大(或最小)的元素放入已排好序的元素集合中,直到未排序中仅剩一个元素为止
public class SelectSort {
public static void main(String[] args) {
int[] arr={10,20,3,22,6,9};
selectSort(arr);
}
public static void selectSort(int[] arr){
//从无序区间不断挑出最小值,挑选n-1次
for (int i=0;i<arr.length-1;i++){
//i下标的左边是有序区间,右边是无序区间
int minIndex=i;
//找出最小值并交换位置
for (int j=i+1;j<arr.length;j++){
if (arr[j]<arr[minIndex]){
minIndex=j; //更新最小值的下标
}
}
//交换最小值和无序区间的位置
int temp=arr[minIndex];
arr[minIndex]=arr[i];
arr[i]=temp;
}
System.out.println(Arrays.toString(arr));
}
}
3.插入排序:
所谓直接插入排序,就是把未排序的元素一个一个地插入到有序的集合中,插入时把有序集合从后向前扫一遍,找到比自己数值小或相等的位置后面插入
//插入排序
@Test
public void insertSort(){
int[] arr=new int[]{20,44,1,6,8,2};
for (int i=0;i<arr.length;i++){
//无序需要插入的值
int insertVal=arr[i];
//有序列表的最后一个位置
int insertIndex=i-1;
//有序列表有值,无序比有序的小
while(insertIndex>=0&&insertVal<arr[insertIndex]){
//比过的有序列表向后挪一位
arr[insertIndex+1]=arr[insertIndex];
//和有序列表的下一位比较
insertIndex--;
}
//比较结束,插入的值位于当前后一位
arr[insertIndex+1]=insertVal;
}
for (int i : arr) {
System.out.print(i+" ");
}
}
4.快速排序:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分的数据分别进行快速排序,整个排序过程可以递归进行,以此来达到整个数据变成有序序列。
public static void quickSort(int[] arr,int left,int right){
int l=left; //左下标
int r=right; //右下标
//pivot 中轴值
int pivot=arr[(left+right)/2];
int temp=0; //临时变量,作为交换时使用
//循环的目的是让比pivot值小的放在左边,大的放在右边
while (l<r){
//在pivot的左边找,找到大于等于pivot的值,才退出
while (arr[l]<pivot){
l += 1;
}
//在pivot的右边找,找到小于等于pivot的值,才退出
while (arr[r]>pivot){
r -=1;
}
//如果l>=r说明pivot左边的值都是小于它的,右边的值都是大于它的;
if (l>=r){
break;
}
//交换值
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//如果交换完后,发现这个 arr[l]==pivot值相等 r--,前移
if (arr[l]==pivot){
r -=1;
}
//如果交换完后,发现这个 arr[r]==pivot值相等 l++,后移
if (arr[r]==pivot){
l +=1;
}
}
//如果l==r,必须l++,r--,否则会出现栈溢出
if (l==r){
l +=1;
r -=1;
}
//向左递归
if (left<r){
quickSort(arr,left,r);
}
//向右递归
if (right>l){
quickSort(arr,l,right);
}
}