在一個有序序列中查詢重複/不存在的數
阿新 • • 發佈:2018-12-27
/*
* 查詢有序序列中 重複/不存在 的數演算法演示
* 版權所有:http://www.cppblog.com/converse/*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define FUNC_IN() printf("\nin %s\n\n", __FUNCTION__)#define FUNC_OUT() printf("\nout %s\n\n", __FUNCTION__)/* 生成一個長度為len的陣列, 其中array[i] = i(0<=i<len) */void generate_array( int array[], int len);
/* 向長度為len的有序陣列中新增一個元素x(0<=x<len - 1), 同時保持原有陣列有序 */void add_to_array(int array[], int len, int x);
/* 刪除長度為len的有序陣列中的一個元素x(0<=x<len), 同時儲存原有陣列有序 */void del_from_array(int array[], int len, int x);
/* 列印一個數組 */void display_array(int array[], int len);
/* 查詢一個長度為len的有序陣列中哪個元素不存在 */int find_not_exist(int array[], int len);
/* 查詢一個長度為len的有序陣列中哪個元素重複了 */int find_duplicate(int array[], int len);
int main(int argc, char*argv[])
{
int count =10;
int*array = NULL;
srand(time(NULL));
if (argc ==2)
{
count = atoi(argv[1]);
}
/* 申請記憶體的時候多申請一個元素 */if ((array = (int* )malloc((count +1) *sizeof(int))) == NULL)
{
printf("malloc error!\n");
exit(-1);
}
/* 首先生成一個元素都是有序的整型陣列 */
generate_array(array, count);
display_array(array, count);
/* 刪除其中的一個元素 */
del_from_array(array, count, rand() % count);
display_array(array, count);
/* 查詢不存在的元素 */int x = find_not_exist(array, count);
printf("the element not exist is %d\n", x);
/* 把刪除的元素補上 */
add_to_array(array, count +1, x);
/* 新增一個重複的元素 */
add_to_array(array, count +1, rand() % count);
display_array(array, count +1);
/* 查詢重複的元素 */
printf("the element duplicate is %d\n", find_duplicate(array, count +1));
free(array);
return0;
}
void generate_array(int array[], int len)
{
int i;
for (i =0; i < len; ++i)
{
array[i] = i;
}
}
void add_to_array(int array[], int len, int x)
{
int i;
/* 把[x + 1, len - 1]之間的元素右移一個位置 */for (i = x +1; i < len -1; ++i)
{
array[i +1] = i;
}
/* x + 1的位置儲存重複的x, 這樣陣列仍然是有序的 */
array[x +1] = x;
}
void del_from_array(int array[], int len, int x)
{
int i;
/* 將[x, len)的元素向左移動一個位置 */for (i = x; i < len; ++i)
{
array[i] = i +1;
}
printf("del_from_array element is %d\n", x);
}
void display_array(int array[], int len)
{
int i;
printf("\n{ ");
for (i =0; i < len; ++i)
{
printf("%d ", array[i]);
}
printf("}\n");
}
int find_not_exist(int array[], int len)
{
FUNC_IN();
int left, right, pos, count;
for (left =0, right = len -1, count =1; left <= right; count++)
{
pos = (left + right) /2;
printf("[%d] left = %d, pos = %d, right = %d\n", count, left, pos, right);
/*
* 如果array[pos] != pos, 那麼不存在的元素一定在[left, pos - 1]之間
*/if (array[pos] != pos)
{
right = pos -1;
}
else
{
left = pos +1;
}
}
FUNC_OUT();
/* left之前的元素都是存在的 */return left;
}
int find_duplicate(int array[], int len)
{
/*
* find_not_exist()函式的返回值表示在它之前的元素都是正確的,
* 因此這個返回位置就是有重複的元素位置 + 1, 於是要減去1
* */return find_not_exist(array, len) -1;
}
* 查詢有序序列中 重複/不存在 的數演算法演示
* 版權所有:http://www.cppblog.com/converse/*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define FUNC_IN() printf("\nin %s\n\n", __FUNCTION__)#define FUNC_OUT() printf("\nout %s\n\n", __FUNCTION__)/* 生成一個長度為len的陣列, 其中array[i] = i(0<=i<len) */void generate_array(
/* 向長度為len的有序陣列中新增一個元素x(0<=x<len - 1), 同時保持原有陣列有序 */void add_to_array(int array[], int len, int x);
/* 刪除長度為len的有序陣列中的一個元素x(0<=x<len), 同時儲存原有陣列有序 */void del_from_array(int array[], int len, int x);
/* 列印一個數組 */void display_array(int array[], int len);
/* 查詢一個長度為len的有序陣列中哪個元素不存在
/* 查詢一個長度為len的有序陣列中哪個元素重複了 */int find_duplicate(int array[], int len);
int main(int argc, char*argv[])
{
int count =10;
int*array = NULL;
srand(time(NULL));
if (argc ==2)
{
count = atoi(argv[1]);
}
/* 申請記憶體的時候多申請一個元素 */if ((array = (int*
{
printf("malloc error!\n");
exit(-1);
}
/* 首先生成一個元素都是有序的整型陣列 */
generate_array(array, count);
display_array(array, count);
/* 刪除其中的一個元素 */
del_from_array(array, count, rand() % count);
display_array(array, count);
/* 查詢不存在的元素 */int x = find_not_exist(array, count);
printf("the element not exist is %d\n", x);
/* 把刪除的元素補上 */
add_to_array(array, count +1, x);
/* 新增一個重複的元素 */
add_to_array(array, count +1, rand() % count);
display_array(array, count +1);
/* 查詢重複的元素 */
printf("the element duplicate is %d\n", find_duplicate(array, count +1));
free(array);
return0;
}
void generate_array(int array[], int len)
{
int i;
for (i =0; i < len; ++i)
{
array[i] = i;
}
}
void add_to_array(int array[], int len, int x)
{
int i;
/* 把[x + 1, len - 1]之間的元素右移一個位置 */for (i = x +1; i < len -1; ++i)
{
array[i +1] = i;
}
/* x + 1的位置儲存重複的x, 這樣陣列仍然是有序的 */
array[x +1] = x;
}
void del_from_array(int array[], int len, int x)
{
int i;
/* 將[x, len)的元素向左移動一個位置 */for (i = x; i < len; ++i)
{
array[i] = i +1;
}
printf("del_from_array element is %d\n", x);
}
void display_array(int array[], int len)
{
int i;
printf("\n{ ");
for (i =0; i < len; ++i)
{
printf("%d ", array[i]);
}
printf("}\n");
}
int find_not_exist(int array[], int len)
{
FUNC_IN();
int left, right, pos, count;
for (left =0, right = len -1, count =1; left <= right; count++)
{
pos = (left + right) /2;
printf("[%d] left = %d, pos = %d, right = %d\n", count, left, pos, right);
/*
* 如果array[pos] != pos, 那麼不存在的元素一定在[left, pos - 1]之間
*/if (array[pos] != pos)
{
right = pos -1;
}
else
{
left = pos +1;
}
}
FUNC_OUT();
/* left之前的元素都是存在的 */return left;
}
int find_duplicate(int array[], int len)
{
/*
* find_not_exist()函式的返回值表示在它之前的元素都是正確的,
* 因此這個返回位置就是有重複的元素位置 + 1, 於是要減去1
* */return find_not_exist(array, len) -1;
}