//将一维数组中存放的两个线性表的位置交换 1.算法思想:先将数组中的全部元素原地逆置,再对前n个和后m个元素分别使用逆置算法,即可实现顺序表的位置交换。 typedefint DataType; voidReverse(DataType A[], int left, int right, int arraySize){ if (left >= right || right >= arraySize) return; int mid = (left + right) / 2; for (int i = 0; i <= mid - left; i++) { DataType temp = A[left + i]; A[left + i] = A[right - i]; A[right - i] = temp; } }
voidExchange(DataType a[], int m, int n, int arraySize){ Reverse(A, 0, m + n - 1, arraySize); Reverse(A, 0, n - 1, arraySize); Reverse(A, n, m + n - 1, arraySize); }
//求两个等长有序序列的中位数 一.算法的设计思想 分别求俩个序列的中位数,设为a,b,求序列A,B的中位数的过程如下 1.若 a=b ,则 a 或 b为所求的中位数,算法结束; 2.若 a<b ,舍弃A中小于 a 的部分,同时舍弃B中大于 b 的部分,要求两次舍弃的长度相等; 3.若 a>b ,舍弃A中大于 a 的部分,同时舍弃B中小于 b 的部分,要求两次舍弃的长度相等; 再保留的两个升序序列中,重复1,2,3过程,直到两个序列中均只含一个元素时为止,较小者即为所求的中位数。
intMajority(int A[], int n){ int i, c, count = 1; c = A[0]; for (i = 1; i < n; i++) { if (A[i] == c) count++; else { if (count > 0) count--; else { c = A[i]; count = 1; } } } if (count > 0) for (i = count = 0; i < n; i++) if (A[i] == c) count++; if (count > n / 2) return c; elsereturn-1; }
//找出数组中未出现的最小正整数 一、算法设计思想 A. 快速排序后从头遍历 B. 用空间换时间。 分配一个用于标记数组中出现了1~n中哪些数的数组,初始时全部标记为0,若出现,则标记为1 intFindMissMin(int A[], int n){ int i, * B; B = (int*)malloc(sizeof(int) * n); memset(B, 0, sizeof(int) * n); for (i = 0; i < n; i++) { if (A[i] > 0 && A[i] <= n) { B[A[i] - 1] = 1; } } for (i = 0; i < n; i++) if (B[i] == 0)break; return i + 1; }
//求三元组最小距离 #define INT_MAX 0x7fffffff intabs_(int a){ if (a < 0) return -a; elsereturn a; }
boolxls_min(int a, int b, int c){ if (a <= b && a <= c) returntrue; returnfalse; }
intFindMinofTrip(int A[], int n, int B[], int m, int C[], int p){ int i = 0, j = 0, k = 0, D_min = INT_MAX, D; while (i < n && j < m && k < p && D_min>0) { D = abs_(A[i] - B[j]) + abs_(B[j] - C[k]) + abs_(C[k] - A[i]); if (D < D_min) D_min = D; if (xls_min(A[i], B[j], C[k])) i++; elseif (xls_min(B[j], C[k], A[i])) j++; else k++; } return D_min; }
typedefstructnode { int data; structnode *next }Node,*PNode;
voidfunc(PNode L, int n){ PNode p = L, r; int* q, m; q = (int*)malloc(sizeof(int) * (n + 1)); for (int i = 0; i < n + 1; i++) *(q + 1) = 0; while (p->next != NULL) { m = p->next->data > 0 ? p->next->data : -p->next->data;
if (*(q + m) == 0) { *(q + m) = 1; p = p->next; } else { r = p->next; p->next = r->next; free(r); } } free(q); }