数组排序算法-定位排序算法

数组排序之定位排序算法:

(1) 算法原理介绍:当遍历到某一个数时,需要一个内循环找到除它本身外的数,这些数有比它小的,记为lessthan,每找到一个就加一;有比它大的,记为biggerthan,每找到一个就加一;介于lessthanbiggerthan之间的数意为重复的数,当arr.length(数组长度)-1-biggerthan(比被排序数大的数的个数)-lessthan(比被排序数小的数的个数)>1(重复数的个数)时,使用一个内循环来填满空隙(空隙中填满重复的数)。通过lessthanarr.length-1-biggerthan之间的区间快速定位被排序数的排好序之后应该所在的位置并精确的把它放到一个新的数组的相应位置里。

(2) 将数组arr中的数以非顺序插入的方式放置到brr中。

代码实现:

数组的创建并初始化:

 

遍历初始数组arr并显示:

 

具体的核心代码:

遍历排好序的数组brr并显示:

 

测试:

有重复数的排序:

 

没重复数的排序:

 

有负数的排序:

 

 完整的代码以及注释:

package com.atguigu.array;

public class PositioningSort {

public static void main(String[] args) {
// 思路:创建一个计数器lessthan,用于记录比待排数小的数 的个数;
// 创建一个计数器biggerthan,用于记录比待排数大的数的个数;
// 当这两个计数器之间有多个空格时,全部用待排数填满;
int lessthan = 0; // 小余待排数的数的个数初始化为零;
int biggerthan = 0; // 大于待排数的数的个数初始化为零;

int[] arr = new int[4];//创建数组arr并设置最大容量;
int[] brr = new int[4];//创建数组brr并设置最大容量;

arr[0] = 6;     //将数组arr的1号位赋值为6;
arr[1] = 2;    //将数组arr的2号位赋值为2;

arr[2] = 8;    //将数组arr的3号位赋值为8;
arr[3] = 5;    //将数组arr的4号位赋值为5;

//排序之前先显示排序前的数组顺序;

System.out.println("排序前的数组为:");
System.out.println("[");
// 遍历排序前的数组arr并显示;
for (int num : arr) {  //通过循环遍历数组arr中的元素;按顺序遍历;
System.out.printf("%d\t", num);  //每循环一次就将遍历到的元素格式化后输出;
}
System.out.println("]");
// 创建一个计数器sum,用于记录是arr中的arr[sum]的值正在被排序;
for (int sum = 0; sum < arr.length; sum++) {

for (int i = 0; i < arr.length; i++) {

if (arr[sum] > arr[i] & sum != i) { // 遍历数组arr,用sum不等于i作为条件避免同一个数被当做重复数;
lessthan++; // 每找到一个比待排数小的就记录下来;
} else if (arr[sum] < arr[i] & sum != i) {// 遍历数组arr,用sum不等于i作为条件避免同一个数被当做重复数;
biggerthan++;// 每找到一个比待排数大的就记录下来;

}

}
// 为避免数据覆盖,需要将排好序的数据放置在新的数组brr中;
brr[lessthan] = arr[sum];
for (int j = lessthan + 1; j < arr.length - biggerthan; j++) {// 通过循环累加brr的索引填补lessthan与arr.lehgth-biggerthan之间的空白,如果不填,默认为零,导致数据丢失,排序错误;
brr[j] = arr[sum];
}
brr[arr.length - 1 - biggerthan] = arr[sum];
lessthan = 0;// 每次内循环结束后都必须初始化,否则出现累加,造成错误;
biggerthan = 0;// 每次内循环结束后都必须初始化,否则出现累加,造成错误;
}

//遍历排序后的数组并显示;

System.out.println("排序后的数组为:");
System.out.println("[");
for (int num : brr) {   // b遍历数组brr;
System.out.printf("%d\t", num);  //每遍历到一个数组元素就格式化后输出;
}
System.out.println("]");
}
}

欢迎各路大佬指点,留言,评论。我在评论区等你们吆。

猜你喜欢

转载自www.cnblogs.com/llj123/p/12334940.html