整型数组由于长度的问题,将在主函数中直接赋值以方便测试函数功能。
find_sole函数参数为排序好的整型数组,数组长度。
本程序中,排序方法为选择排序。
#include<stdio.h>
int main(){
int* sort(int*, int);//排序整型数组,以方便找孤立数字
void find_sole(int *, int);//查找孤立数字
int arr[] = { 5, 4, 3, 2, 1, 5, 2, 4, 9, 10, 6};
int length = sizeof(arr) / sizeof(arr[0]);
find_sole(sort(arr, length), length);
system("pause");
return 0;
}
void find_sole(int* arr, int length){
int i, count = 0;
for (i = 0; i < length; i += 2){
if (*(arr + i) != *(arr + i + 1)){
printf("第%d个孤立的数字为-> %2d 。\n", ++count, *(arr + i--));
}
}
}
int* sort(int* arr, int length){
int i, j, k;
for (i = 0; i < length - 1; i++){
k = i;
for (j = i; j < length ; j++){
if (*(arr + j) < *(arr + k))k = j;
}
int t = *(arr + k);
*(arr + k) = *(arr + i);
*(arr + i) = t;
}
return arr;
}
但是考虑到对于本题来说,虽然查找数字的函数十分精简,但不好在如果数组未排序还需有排序的过程,且该函数无法返回孤立数字的正确下标。
故而以传统思想编写此函数,通过增加一flag数组来表示数据是否已被匹配。
void find_alone(int arr[], int length){
int i, j, count = 0;
int flag[20] = { 0 };//flag长度必须大于等于length
for (i = 0; i < length; i++){
if (flag[i] == 1)continue;
for (j = 0; j < length; j++){
if ((i != j) && (arr[i] == arr[j])){
flag[j] = 1;//被匹配过
break;
}
}
if (j == length)
printf("第%2d个孤立的数字为 -> %2d ,数组下标为 -> %2d。\n", ++count, arr[i], i);
}
}