归并排序

    科技2022-08-14  102

    有关归并排序的一些问题,请大佬们指点一下。流程都明白了,但是有个小细节一直没看明白,就是当所有数组元素全部放入临时空间temp中去后,将temp当中的元素再按顺序放回a数组,这时的 a[q+nl] = temp[q] 是啥意思,虽然我知道如果不加nl的话结果就不对了,但是我还是不太明白这一部的具体含义,q+nl的作用具体是啥,拜托大佬们啦!!!救救小白~~

    #include <iostream> using namespace std; //归并排序,对数组的[nl,nr)进行从小到大排序 void mergeSort(int a[],int nl,int nr); //打印数组a的[nl,r)所有元素 void print(int a[],int nl,int nr); int main() { int a[] = {12,23,78,6,25,16,27,55,30}; int n = sizeof(a) / sizeof(a[0]); //数组的大小 print(a,0,n); mergeSort(a,0,n); print(a,0,n); return 0; } //归并排序,对数组的[nl,nr)进行从小到大排序 void mergeSort(int a[],int nl,int nr) { //1.分解,二分的策略 //递归出口,只剩1个元素的时候 if(nr - nl == 1){ return; } int mid = nl + (nr - nl) / 2; //求中点 //左半部分[nl,mid)归并排序 mergeSort(a,nl,mid); //左半部分[mid,nr)归并排序 mergeSort(a,mid,nr); //2.合并有序数组a的[nl,mid)和[mid,nr)合并 int *temp = new int[nr - nl]; //临时空间 int i = nl,j = mid,k = 0; //定义3个滑标 while(i < mid && j < nr){ // temp[k++] = a[i] < a[j] ? a[i] : a[j]; if(a[i] < a[j]){ //左边小 temp[k] = a[i++]; } else{ temp[k] = a[j++]; } k++; } //没取完的继续取完 while(i < mid){ temp[k++] = a[i++]; } while(j < mid){ temp[k++] = a[j++]; } //3.临时空间数据恢复到原数组 for(i = 0;i < k;i++){ a[i + nl] = temp[i]; } delete[] temp; } //打印数组a的[nl,r)所有元素 void print(int a[],int nl,int nr) { for(int i = nl;i < nr - 1;i++){ cout << a[i] << " "; } cout << a[nr - 1] << endl; }
    Processed: 0.022, SQL: 9