算法题-数组内的数是否连续整数

题目:一数组有N个整数,数组内有可能有重复的整数,0可以当做任何数,判断数组内的数字是否是连续的整数。如

数组A [5, 1, 3, 0, 0]两个0分别可以看做2、4,所以数组A为连续数组。

思路:

1、将数组A从小到大排序得到数组B;

2、判断数组B除0外是否还有其他重复数字,如果有重复数字则不是连续数组,如果无执行步骤3;

3、取数组B最后一个数,和数组B第一个非0数,求差,如果差小于数组长度N,则该数组为连续数组,否则为非连续数组。

实现:

#include <stdio.h>
#define LENGTH 5
void quicksort(int *arr, int low, int hight);
int findPos(int *arr, int low, int hight);
bool isRepeat(int *arr, int length);
int diff(int *arr, int length);
int main(int argc, char *argv[])
{
	int arr[LENGTH] = { 0, 1, 0, 3, 0 };

	for (int i = 0; i<LENGTH; ++i){
		printf("%d ", arr[i]);
	}
	printf("\n");
	quicksort(arr, 0, LENGTH-1);  //0表示从数组0位置开始,到4位置排序 

	if (!isRepeat(arr, LENGTH)){
		if (diff(arr, LENGTH) < LENGTH){
			printf("为顺序数组");
		}
		else{
			printf("为非顺序数组");
		}
	}
	else{
		printf("为非顺序数组");
	}
	printf("\n");
	return 0;
}

//数组除0外是否还有其他重复数字
bool isRepeat(int *arr, int length){
	for (int i = 0; i < length; i++){
		if (0 == arr[i]){
			continue;
		}
		if (i + 1 < length && arr[i] == arr[i + 1]){
			return true;
		}
	}
	return false;
}

//求数组末位和首位非0数字的差
int diff(int *arr, int length){
	int temp = 0;
	for (int i = 0; i < length; i++){
		if (0 != arr[i]){
			temp = arr[i];
			break;
		}
	}

	return arr[length - 1] - temp;
}

/*
快速排序算法
*/
void quicksort(int *arr, int low, int hight){  //快速排序算法的实质就是当前分为两半,分别给这两半进行快速排序,直到low==hight的时候
	int pos;
	if (low<hight){
		pos = findPos(arr, low, hight);  //先对整体进行一次快速排序,将其分成两半
		quicksort(arr, low, pos - 1);  //然后分别对pos位置左边的部分在进行快速排序,位置右边的部分进行快速排序 
		quicksort(arr, pos + 1, hight);
	}
}

int findPos(int *arr, int low, int hight){
	int val = arr[low];
	while (low<hight){  //再一次快速排序中只要low的值比hight小,我们就应该去移动,因为当前这次排序还没有完成 
		while (low<hight&&arr[hight] >= val){  //表示只有当前指针没有重合并且当前右边hight指向的值大于val时,才会向左移动hight
			hight = hight - 1;
		}
		arr[low] = arr[hight];  //将比val小的值赋到low 
		while (low<hight&&arr[low] <= val){
			low = low + 1;
		}
		arr[hight] = arr[low];  //将比val大的值赋到hight上 
	}
	arr[low] = val;  //找到了所属的位置,并且将我们选定的值val赋到这个位置上去 

	return hight;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值