关于几种常用的数组排序的算法简介

1.冒泡排序算法:(时间复杂度是n*n)

冒泡排序法是最基本的排序法之一,冒泡排序法的运行机制是通过循环遍历元素,并调整相邻元素顺序的一种简单排序方法。 冒泡排序法的运行情况如下(以将数组 {21, 99, 3, 1024, 16} 排列为升序为例):

(1)冒泡排序法的第一次遍历目的是将数值最大的元素移动到数组的尾部。首先,将元素21与元素99进行比较,由于21 < 99,所以不用交换元素;其次,将元素99与元素3进行比较,由于99 > 3,所以需要交换元素(即99和3的位置互换,数组的序列被调整为 {21, 3, 99, 1024, 16});再次,将元素99与元素1024进行比较,由于99 < 1024,所以也不用交换元素;最后,将元素1024与元素16进行比较,由于1024 < 16,所以需要交换元素(即1024与16的位置互换)。经过第一次遍历将最大的元素1024调整到了数组的尾部,数组序列变为 {21, 3, 99, 16, 1024}。

(2)冒泡排序法的第二次遍历与第一次原理一致,只不过第二次遍历不再关系数组的尾部,因为经过第一次遍历后,数组的尾部已经存储了数组中数值最大的元素,所以第二次遍历的目的是将数组中数值第二大的元素,存储到数组的倒数第二个位置(即此时只关心数组前四个元素 {21, 3, 99, 16}的顺序)。首先,将元素21与元素3进行比较,由于21 > 3,所以需要交换元素(即21和3位置互换,数组的前四位序列被调整为 {3, 21, 99, 16});其次,将元素21与元素99进行比较,由于21 < 99,所以不用交换元素;最后,将元素99与元素16进行比较,由于99 > 16,所以需要交换元素(即99和16的位置互换)。经过第二次遍历数组序列变为 {3, 21, 16, 99, 1024}。

(3)依此类推,第三次遍历将数组中数值第三大的元素存储到数组的倒数第三个位置,第四次遍历将数组中数值第四大的元素存储到数组的倒数第四个位置,由于数组一共包含五个元素,则排序完成。

实现代码如下:

int[] test = new int[]{21,99,3,1024,16};
int temp = 0;
for(int i = test.length; i > 0; i--){
for(int j = 0; j < i-1;j++){
if(test[j] > test[j+1]){
temp = test[j];
test[j] = test[j+1];
test[j+1] = temp;
}
}
}
for(int a:test){
System.out.print(a+" ");
}

结果是:

2.选择排序法:(时间复杂度是n*n)

将要排序的数组分成两部分,一部分是从大到小已经排好序的,一部分是无序的,从无序的部分取出最小的放到已经排序的最后面。实现如下:

int[] test = new int[]{21,99,3,1024,16};
int temp = 0;
int m ;
System.out.println("原数组是:");
for(int a:test){
System.out.print(a+" ");
}
System.out.println();
for(int i = 0;i < test.length;i++){
m = i;//默认第一个元素最小
for(int j = i+1; j < test.length;j++){
if(test[m] > test[j]){//找到数组中最小的元素,其索引是m
m = j;
}
}
if(m != i){//表明数组没有排序完毕,交换m和i位置上的元素
temp = test[m];
test[m] = test[i];
test[i] = temp;
}
}
System.out.println("采用选择排序后的数组是:");
for(int a:test){
System.out.print(a+" ");
}

结果如下:

3..插入排序法:(时间复杂度是n*n)

将要排序的数组分成两部分,每次从后面的部分取出索引最小的元素插入到前一部分的适当位置。基本实现如下:

int[] test = new int[]{21,99,3,1024,16};
int temp = 0;
int j ;
System.out.println("原数组是:");
for(int a:test){
System.out.print(a+" ");
}
System.out.println();
for(int i = 1;i < test.length;i++){
temp = test[i];
j = i-1;
while(temp < test[j]){
test[j+1] = test[j];
j--;
if(j == -1){
break;
}
}
test[j+1] = temp;
}
System.out.println("采用插入排序后的数组是:");
for(int a:test){
System.out.print(a+" ");
}

结果是:

 4..快速排序法:(时间复杂度是n*log(n))

快速排序法号称是目前最优秀的算法之一,实现思路是,将一个数组的排序问题看成是两个小数组的排序问题,而每个小的数组又可以继续看成更小的两个数组,一直递归下去,直到数组长度大小最大为2。实现如下:

/**
* @param arr-需要排序的数组
* @param low-数组的第一个索引值
* @param high-数组的最后一个索引值
*/
public static void sort(int arr[],int low,int high){
int l=low;
int h=high;
int povit=arr[low];
while(l<h)
{
while(l<h&&arr[h]>=povit)//从右往左找寻比povit小的元素
h--;
if(l<h){//将比povit小的元素放在其左边
int temp=arr[h];
arr[h]=arr[l];
arr[l]=temp;
l++;
}
while(l<h&&arr[l]<=povit)//从左往右找寻比povit大的元素
l++;
if(l<h){//将比povit大的元素放在其右边
int temp=arr[h];
arr[h]=arr[l];
arr[l]=temp;
h--;
}
}
for(int a:arr){
System.out.print(a+" ");
}
System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n");
if(l>low)sort(arr,low,l-1);
if(h<high)sort(arr,l+1,high);
}

结果是:

猜你喜欢

转载自www.cnblogs.com/zhaoziming-zhaogaojun/p/9554497.html