标签:arr help int ArrayList mergeSize ++ 手写 排序 public
手写一个ArrayList排序算法
Method
类
package com.inspire.util;
import java.util.ArrayList;
import java.util.List;
public class Method {
private List<Integer> list=new ArrayList<Integer>();//保存函数的行信息
public List<Integer> getList() {
return list;
}
}
List
排序类
package com.inspire;
import com.inspire.util.Method;
import java.util.Arrays;
import java.util.List;
public class test15 {
public static void main(String[] args) {
Method method = new Method();
int[] testEffiArr = generateRandomArray(100, 100);
for (int num : testEffiArr) {
method.getList().add(num);
}
listSort(method.getList());
Arrays.sort(testEffiArr);
boolean succeed = true;
for (int i = 0; i < testEffiArr.length; i++) {
if (method.getList().get(i) != testEffiArr[i]) {
succeed = false;
}
}
System.out.println(succeed == true ? "Nice!" : "Oh No!");
System.out.println("list Sort After : " + method.getList());
}
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
public static void listSort(List<Integer> methodLineList) {
int[] methodLineArr = new int[methodLineList.size()];
for (int i = 0; i < methodLineList.size(); i++) {
methodLineArr[i] = methodLineList.get(i);
}
stableSort(methodLineArr);
methodLineList.clear();//clear是清空当前集合元素内容
for (int i = 0; i < methodLineArr.length; i++) {
methodLineList.add(methodLineArr[i]);
}
}
//非递归方法实现归并排序(稳定性最好的排序算法)
public static void stableSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
int mergeSize = 1;
while (mergeSize < N) {
int L = 0;
while (L < N) {
int M = L + mergeSize - 1;
if (M >= N) {
break;
}
int R = Math.min(M + mergeSize, N - 1);
merge(arr, L, M, R);
L = R + 1;
}
if (mergeSize > N / 2) {
break;
}
mergeSize <<= 1;
}
}
private static void merge(int[] arr, int L, int mid, int R) {
int[] help = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
while (p1 <= mid && p2 <= R) {
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid) {
help[i++] = arr[p1++];
}
while (p2 <= R) {
help[i++] = arr[p2++];
}
for (int j = 0; j < help.length; j++) {
arr[L + j] = help[j];
}
}
}
标签:arr,help,int,ArrayList,mergeSize,++,手写,排序,public 来源: https://blog.csdn.net/weixin_42424330/article/details/121349452
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。