标签:index 归并 int arr ++ 数组 排序 图文
归并排序(Merge sort)
利用归并的思想进行排序的方法进行排序。
程序思路:假设初始值有N个记录,则可以看成是N个有序的子序列,每个子序列的长度为1,然后两两归并,得到N/2个长度为2或1的子序列,再进行两两归并。一直不断的重复,直到得到一个长度为N的有序序列为止,这样的排序算法,称之为2路归并排序。
利用数组元素进行理解(如下图示):
元素:{28,15,22,26,16,29,21,18}
代码图示+注释:
代码+注释展示:
//归并排序
public static void main(String[] args) {
int[] arr = {28,15,22,26,16,-5,29,21};//定义一个排序的数组
//拆分
split(arr,0,arr.length-1);//调用拆分数组的方法
//归并
//mergerSort(arr,0,3,arr.length-1);
//输出
System.out.println(Arrays.toString(arr));//打印数组元素
}
//
public static void split(int[] arr,int staIndex,int endIndex){//定义一个拆分的方法,定义三个参数,一个是传进的数组,一个是第一个数的下标和最后一个数的下标
//计算中间索引
int centerIndex = (staIndex+endIndex)/2;//从中间进行拆分
if (staIndex < endIndex) {//进行一个条件判断,
split(arr,staIndex,centerIndex);//拆分左边
split(arr,centerIndex+1,endIndex);//拆分右边
mergerSort(arr,staIndex,centerIndex,endIndex);//调用归并方法,
}
}
//定义一个归并的方法
public static void mergerSort(int[] arr,int startIndex,int centerIndex,int endIndex){
int[] tempArray = new int[endIndex-startIndex+1];//定义的一个临时数组,数组长度是灵活的,因为数组的长度是在变化的
int i = startIndex;//定义左边的一个其实索引
int j = centerIndex+1;//定义右边的一个其实索引,因为被分为两段,所以是中间值加1
int index = 0;//定义临时数组的一个其实索引
while (i<=centerIndex && j<=endIndex){ //比较左右两个数组的元素大小,往临时数组中放
if (arr[i] <= arr[j]) {//如果前面的元素i小于等于后面的元素时,进入到下面的结果
tempArray[index] = arr[i];//满足条件进入到该语句时,将arr[i]的值给到定义的临时数组tempArray中
i++;//自增
}else {
tempArray[index] = arr[j];//否则就会把值给到临时定义的数组中,进行自增
j++;//自增
}
index++;
}
//处理剩余的元素
while (i<=centerIndex){
tempArray[index] = arr[i];
i++;
index++;
}
while (j<=endIndex){
tempArray[index] = arr[j];
j++;
index++;
}
//将临时数组中的元素取到原数组中
for (int k = 0; k < tempArray.length; k++) {
arr[k+startIndex] = tempArray[k];
}
}
标签:index,归并,int,arr,++,数组,排序,图文 来源: https://blog.csdn.net/qq_43310845/article/details/121632203
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。