給定一整型數組,若數組中某個下標值大的元素值小於某個下標值比它小的元素值,稱這是一個反序,定一數組
【問題】
找出反序的個數
給定一整型數組,若數組中某個下標值大的元素值小於某個下標值比它小的元素值,稱這是一個反序。 即:數組a[]; 對於i < j 且 a[i] > a[j],則稱這是一個反序。 給定一個數組,要求寫一個函數,計算出這個數組裡所有反序的個數。
【代碼】
#include <stdio.h>#include <stdlib.h>#include <string.h>int sumNum = 0;void merge(int *a, int *b, int begin, int mid, int end){int i, j, k = 0;i = begin;j = mid + 1;while (i <= mid && j <= end) {if (a[i] < a[j])b[k++] = a[i++];else {b[k++] = a[j++];sumNum += mid - i + 1;//計算反序對}}while (i <= mid)b[k++] = a[i++];while (j <= end)b[k++] = a[j++];for (i = 0; i < k; i ++)a[i + begin] = b[i];}void mergeSort(int *a, int *b, int begin, int end)//歸併排序,時間複雜度O(n*lgn)。{int mid = (begin + end) / 2;if (begin < end) {mergeSort(a, b, begin, mid);mergeSort(a, b, mid + 1, end);merge(a, b, begin, mid, end);}}int countReverse(int *a, int len) //遍曆尋找反序,時間複雜度O(n^2)。{int count = 0;int i, j;for (i = 0; i < len - 1; i ++)for (j = i + 1; j < len; j++)if(a[i] > a[j])count++;return count;}int main(void){int count;int a[] = {7, 4, 5, 3, 8, 6, 9, 10, 11};int len = sizeof(a) / sizeof(int);int *b;b = (int *)malloc(len * sizeof(int));count = countReverse(a, len);mergeSort(a, b, 0, len - 1);printf("%d\n", sumNum);printf("%d\n", count);free(b);return 0;}【運行結果】
VB:怎返回vb一維數組某個元素所對應的下標的值?
最簡單的就是比較,找出這個元素的位置,然後輸出
如
array1 = Array(1, 2, 3, 4, 5)
For i = 0 To UBound(array1)
If array1(i) = 2 Then
Print i
Exit For
End If
Next i
參考資料:然後
C語言:找出數組中最大元素的位置(下標值)
#include<stdio.h>#include<math.h>int main(){ int n,a[10]; int i,max,loc; while((n=getchar())!=EOF) { for(i=0; i<n-'0'; i++) scanf("%d",&a[i]); max=a[0]; loc=0; for(i=1; i<n-'0'; i++) { if(a[i]>max) { max=a[i]; loc=i; } } printf("%d %d\n",max,loc); fflush(stdin); } return 0;}小小修改即可,scanf()!=EOF並不能達到你想要的目的 ,改成上面用getchar即可。
運行結果如下:
噢~~剛又研究了下scanf
例如:
scanf("%d,%d", &a, &b); 如果a和b都被成功讀入,那麼scanf的傳回值就是2 如果只有a被成功讀入,傳回值為1 如果a和b都未被成功讀入,傳回值為0 如果遇到錯誤或遇到end of file,傳回值為EOF。
scanf執行成功時返回的是參數數目。
所以你這個也行,改為下面這樣就行 運行結果一樣
#include<stdio.h>#include<math.h>int main(){ int n,a[10]; int i,max,loc; while(scanf("%d",&n)!=EOF) { for(i=0; i<n; i++) scanf("%d",&a[i]); max=a[0]; loc=0; for(i=1; i<n; i++) { if(a[i]>max) { max=a[i]; loc=i; } } printf("%d %d\n",max,loc); //fflush(stdin); } return 0;}