输出数组最短无序子数组

问题描述: 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序,即输出数组得最短无序子数组。

思路: 既然要成为升序排列,那么数组第一个元素为最小值,最后一个元素为最大值;再依次判断第二个、第三个......是否依次升序,倒数第二个、倒数第三个......是否为依次降序,如果不是按依次大小排列得顺序,则返回下标值。

代码实现: 

#include <stdio.h>
#include <stdlib.h>
int main() {
	int A[] = { 1,6,4,7,12,10,19 };
	int size = sizeof(A) / sizeof(A[0]);
	int i;
	int min, max;
	int left = 0;
	int right = size - 1;
	min = A[0];
	max = A[0];
	// 求最值
	for (i = 0; i < size; i++) {
		if (A[i] < min) {
			min = A[i];
		}
		if (A[i] > max) {
			max = A[i];
		}
	}
	// 最值是否是头尾并移动左右值
	while (left <= right) {
		printf("最短无序数组下标:");
		if (A[left] == min && A[right] != max) {
			while (A[left] < A[left + 1]) {
				left++;
			}
			printf("%d %d\n", left, right);
			break;
		}
		else if (A[left] != min && A[right] == max) {
			while (A[right] > A[right - 1]) {
				right--;
			}
			printf("%d %d\n", left, right);
			break;
		}
		else if (A[left] != min && A[right] != max) {
			printf("%d %d\n", left, right);
		}
		else if (A[left] == min && A[right] == max) {
			while (A[left] < A[left + 1]) {
				left++;
			}
			while (A[right] > A[right - 1]) {
				right--;
			}
			printf("%d %d\n", left, right);
			break;
		}
	}
	// 输出最小无序
	printf("最短无序子数组: \n");
	for (i = left; i <= right; i++) {
		printf("%d ", A[i]);
	}
	printf(" \n");
	system("pause");
	return 0;
}


运行结果:

最短无序数组下标:1 5
最短无序子数组:
6 4 7 12 10
请按任意键继续. . .


 

发布了21 篇原创文章 · 获赞 2 · 访问量 869

猜你喜欢

转载自blog.csdn.net/weixin_44132627/article/details/104461910