给定一个整数数组及其长度,存在索引值m与n,使得只需要对m和n之间的元素进行排序,即可完成整个数组从小到大的排序,试找出m与n之差绝对值最小时的m与n值。
函数原型:int findMinSortRegion(int arr[],int arr_size,int *m,int *n)
示例:数组{1,2,4,7,10,11,7,12,6,7,16,18,19}满足条件的m与n的值为(3,9)
}
//有数组 A,长度n int max = A[0], right = 0; for (int i = 1; i < n; i++){ if (A[i] > max){ max = A[i]; } else { right = i; } }
int min = A[n - 1], left = n - 1; for (int i = n - 2; i >= 0; i--){ if (A[i] < min){ min = A[i]; } else { left = i; } }这样,当right > left 时,它们之间的元素就是待排序的最短子数组。若right < left,说明原数组有序。
认为这个函数应该返回void,因为m,n已经是指针变量。
void findMinSortRegion(int arr[], int arr_size, int *m, int *n) {
//初始化m和n的值
m = 0;
n = arr_size - 1;
int stop = 0;//用来标识m和n,应该遍历到哪里停止。
for (; m < n; m++) {
for (int i = m + 1; i < arr_size; i++) {
if (arr[i] < arr[m]) {//当第m个后面的数不再都大于第m个时
stop = 1;
}
}
if (stop == 1) {
break;
}
}//confirm the value of m;
stop = 0;
for (; n >= m; n--) {
for (int i = n - 1; i < arr_size; i--) {
if (arr[i] > arr[n]) {//当第n个数前面的不再是都小于第n个数时
stop = 1;
}
}
if (stop == 1) {
break;
}//confirm the value of n;
}
}