admin 管理员组

文章数量: 1086019


2024年4月13日发(作者:底部导航)

排序

常见的简单排序算法

I. 选择排序

选择排序思路:选择出数组中的最小元素,将它与数组的第一个元素交换位置。

再从剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置。 不断

进行这样的操作,直到将整个数组排序。

public void sort(int[] arr){

int N = ;

int minIndex = -1;

for(int i=0;i

是当前元素

minIndex=i;

for(int j=i+1;j

当前元素后面的元素

if(arr[j]

minIndex=j;

}

}

if(minIndex==i){ //TODO:

这里有个小优化:如果当前元素是最小的则不用

交换了

continue;

}

swap(arr,minIndex,i);

}

}

private void swap(int[] arr,int i,int j){

int tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}

@Test

public void test(){

int[] a={3,5,2,4,1,0,-3};

rray(a);

sort(a);

rray(a);

}

选择排序需要 ~N2/2 次比较和 ~N 次交换,它的运行时间与输入无关,这个特点

使得它对一个已经排序的数组也需要这么多的比较和交换操作。

II. 冒泡排序

冒泡排序思路:从左到右不断交换相邻逆序的元素,在一轮的循环之后,可以让

未排序的最大元素上浮到右侧。在一轮循环中,如果没有发生交换,就说明数组

已经是有序的,此时可以直接退出。

public void sort(int[] arr){

for(int i=-1;i>0;i--){

for(int j=0;j

if(arr[j]>arr[j+1]){

swap(arr,j,j+1);

}

}

}

}

private void swap(int[] arr,int i,int j){

int tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}

添加一个状态变量对冒泡排序进行优化:

public void sort(int[] arr){

boolean isSorted = false;

for(int i=-1;i>0 && !isSorted ;i--){

//!isSorted

条件,当

isSorted=true

时说明是有序的,则不需要再执行了

isSorted = true; //

初始时认为是有序的

for(int j=0;j

if(arr[j]>arr[j+1]){

isSorted = false; //

存在逆序,则是无序的

swap(arr,j,j+1);

}

}

}

}

private void swap(int[] arr,int i,int j){

int tmp = arr[i];

arr[i] = arr[j];

arr[j] = tmp;

}

冒泡排序是稳定的排序算法,平均时间复杂度是 O(n^2)。


本文标签: 元素 交换 排序 数组 选择