Ⅰ 數據結構與演算法 數組題
(1)如圖可知,A是一個nXn的矩陣,非零元素是
(倒數第一行應該是 (R-n) is even 就是偶數,我打錯了)
以及上面全部是是n為奇數的情況,圖裡面畫的nXn矩陣的n一定是奇數,所以應該不用考慮n為偶數的情況
Ⅱ 有關java數組的題,
寫一個你參考下
public static void main(String[] args) {
String[] str1={"11","22","33","44","55","66","77","88"};
String[] str2={"aa","bb","cc","dd","ee","ff","hh","ii"};
String[] str=add(str1,str2);
//兩兩置換位置
for(int i=0;i<str.length;i=i+2){
String tmp=str[i];
str[i]=str[i+1];
str[i+1]=tmp;
}
//輸出結果
for (int i = 0; i < str.length; i++) {
System.out.print(str[i]+" ");
}
}
//連接兩個字元數組
public static String[] add(String[] a, String[] b) {
String[] result = new String[a.length + b.length];
int i = 0;
for (; i < a.length; i++) {
result[i] = a[i];
}
int j = 0;
for (; i < result.length; i++) {
result[i] = b[j];
j++;
}
return result;
}
Ⅲ 演算法題,請給出下面二維數組的排序演算法
#include <stdio.h> #include <stdlib.h>#include <time.h> #define LINE 10 //預定義二維數組行數#define COLUMN 10 //列數void bubble_sort(int a[], int n){ int i, j, temp; for (j = 0; j < n; j++) for (i = j+1; i< n ; i++) { if(a[i] < a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } }} int main(){ int arr[LINE][COLUMN]={0}; int i,j,k; srand((unsigned)time(NULL));//初始化隨種子 for (i = 0; i != LINE; i++) { for(j=0;j!=COLUMN;++j){ //逐行輸入數據 arr[i][j]=rand()%1000+1;//利用隨機數生成1000以內整數,方便調試 //scanf("%d",&arr[i][j]);//手工輸入測試數據 } bubble_sort(arr[i], COLUMN);//輸入完一行,就對該行進行排序 } for (i = 0; i != LINE; i++)//輸出排序後結果 { for(j=0;j!=COLUMN;++j){ printf("%4d ",arr[i][j]); } printf("\n"); } return 0;}
Ⅳ 關於數組的演算法問題
二分查找+索引可以使演算法的時間復雜度將為o(log(n))左右
前提要求是兩個表在建立時要 按照ID有序的建立
樓上想法很好 可惜這個是數組 不是鏈表
無序沒有關系 你插入的時候按照順序 開始亂序的事 你給他排個序
這個是一勞永逸的事
http://ke..com/view/610605.htm
Ⅳ 關於數組演算法的問題
二分該數的位置
輸入數設為x,數組設為a,數組長度為n
若我們取a[mid]與x比較
由於a是升序的,a[mid]前面的數都比a[mid]小,所以若x>a[mid] 則x>a[mid]前面的所有數,我們想要的答案就在區間[mid+1, n]。
反之答案與[1,mid-1]之間,若a[mid]=x,就退出演算法(找到答案),若a[mid]<x且a[mid+1]>x,則x相鄰角標也已找到,就為mid與mid+1.
分析這個演算法的時間復雜度,
判斷答案在不在[l,r]中,取mid=(l+r)/2.這樣花O(1)判斷後即可鎖定答案在[l,mid-1]還是在[mid+1,r]
這樣設規模為n的問題時間耗費為T(n)
則由演算法過程可知:T(n)=O(1)+T(n/2) , T(1)=O(0)
n=2時,T(2)=O(1)+O(0)=O(1)
n=4時,T(4)=O(1)+O(1)=O(2)
n=8時,T(8)=O(1)+O(2)=O(3)
可發現
0=log2(1),
1=log2(2),
2=log2(4),
3=log2(8).
用數學歸納法(詳見《數據結構與演算法初步》中「分治演算法的時間復雜度計算」)即可證明該演算法時間復雜度為O(log2(n)).
順便給份代碼(c++):
#include<cstdio>
int main(){
int a[100005]={0,2,3,4,66,456,2222},n=6,x=1,ans,ret;//位置0按中國習慣不放數。
int l=1,r=6,mid;//搜索區間[1,6]
while(l<=r){
mid=(l+r)>>1;
if(a[mid]==x){ ans=mid;break; }
if(a[mid]<x && a[mid+1]>x){ ret=mid;break; }
if(a[mid]<x) l=mid;
else r=mid;
}
if(ans) printf("%d",ans);
else printf("%d %d",ret,ret+1);
}
注意,若查詢的數沒有前一個或後一個數,則會出錯
如果為了簡潔,用下面這個:
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int a[100005]={0,2,3,4,66,456,2222},n=6,x=567,ans,ret;//位置0按中國習慣不放數。
ans=lower_bound(a+1,a+7,x)-a;
if(a[ans]==x) printf("%d",ans);
else printf("%d %d",ans-1,ans);
}
lower_bound返回(升序)數組中第一個大於等於x的數的指針
Ⅵ 一個關於二維數組的演算法問題
因為相鄰元素最多隻有8個,可以設一個長度為8偏移坐標數組,內容是
int pos[8][2]={
-1,-1,
-1,0,
-1,1,
0,-1,
0,1
1,-1,
1,0,
1,1
};
之後對a中元素二重循環,對每個元素a[i][j],執行一個子循環
for(k=0;k<8;k++)
if(i+pos[k][0]<0 || i+pos[k][0]>4 || j+pos[k][1]<0 || j+pos[k][1]>4)
continue;
else
將a[i+pos[k][0]][j+pos[k][1]]放入用於存放a[i][j]的相鄰元素的一個輔助數組
Ⅶ 求java數組經典例題。。。。。。。
經典的?那莫過於對數組的排序了。
import java.util.*;
import java.io.*; public class SortAlgorithm { static Random rand = new Random(); static void bubbleSort(int[] numlist) { // 冒泡排序演算法 int temp; for(int i=1;i<numlist.length;i++) { for(int j=0; j<numlist.length-i;j++) { if(numlist[j]>numlist[j+1]) { temp=numlist[j+1]; numlist[j+1]=numlist[j]; numlist[j]=temp; } } } } static void selectionSort (int[] numlist) //選擇排序演算法 { int temp; for(int i=0;i<numlist.length-1;i++) for(int j=i+1;j<numlist.length;j++) if(numlist[i]>numlist[j]) { temp = numlist[j]; numlist[j] = numlist[i]; numlist[i] = temp; } } static void insertSort (int[] numlist) //插入排序演算法 { int temp,in,out; for(out=1;out<numlist.length;out++) { temp=numlist[out]; in=out; while(in>0 && numlist[in-1]>=temp) { numlist[in]=numlist[in-1]; --in; } numlist[in]=temp; } } static void display (int[] num) // 列印出排序結果 { for(int i = 0;i<num.length;i++) System.out.print(num[i]+" "); System.out.println(""); } static int pRand(int mod) // 生成隨即數組 { return Math.abs(rand.nextInt())%mod; } public static void main(String args[])throws IOException { int[] numList = new int[10]; for(int i = 0;i<numList.length;i++) numList[i] = pRand(100); //調用pRand方法,把隨即生成的數據輸入到 // 數組中 System.out.println("隨即生成的數組是:"); // 列印出原數組, for(int j =0;j<numList.length;j++) System.out.print(numList[j]+" "); System.out.println(""); double begin = System.currentTimeMillis(); //排序開始時間,調用系統的當前時間 bubbleSort(numList); //執行冒泡排序 double end = System.currentTimeMillis(); //排序結束時間,調用系統當前時間 System.out.println("冒泡排序用時為:" + (end-begin)); //排序用時 System.out.println("排序後的數組為:"); display(numList); begin = System.currentTimeMillis(); selectionSort(numList); end = System.currentTimeMillis(); System.out.println("選擇排序用時為:" +(end-begin)); System.out.println("排序後的數組為:"); display(numList); begin = System.currentTimeMillis(); insertSort(numList); end = System.currentTimeMillis(); System.out.println("插入排序用時為:" + (end-begin)); System.out.println("排序後的數組為:"); display(numList); } }
Ⅷ 急求數組求和的演算法問題
#include"stdio.h"
#define N 10
main()
{
int s[N],m,i,j;
printf("請輸入%d個整數:\n",N);
for(i=0;i<N;i++)
scanf("%d",s+i);
printf("請輸入m的值:");
scanf("%d",&m);
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if((s[i]+s[j])==m)
printf("\n符合條件的數是%d,%d\n",s[i],s[j]);
}
Ⅸ c語言中,數組元素問題的常用簡單演算法
楊輝三角
冒泡排序
選擇排序