题目:一数组有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;
}