zoukankan      html  css  js  c++  java
  • Java数据结构与算法(1)

    有序表需要掌握的插入方法,删除方法和二分法查找方法。

    插入方法: 从前往后找到比要插入的值大的数组项,将该数组项及之后的项均后移一位(从最后一项起依次后移),最后将要插入的值插入当前数组项。

    删除方法: 从前往后找到要删除的项,将该数组项之后的项均前移一位(从该数组项后一项起依次往前移);

    二分法查找: 通过将数组数据项范围不断对半分割来查找特定的数据项。

    示例代码:

    package chap02.OrderedArray;
    
    class OrdArray {
        private long[] a;                 
        private int nElems;               
        
        public OrdArray(int max) {
           a = new long[max];             
           nElems = 0;
        }
        
        public int size() { 
            return nElems; 
        }
        
        // 插入方法
        public void insert(long value) {
           int j;
           for(j=0; j<nElems; j++) {        
              if(a[j] > value) {           // (linear search)
                 break;
              }
           }
           for(int k=nElems; k>j; k--) {    // move bigger ones up
              a[k] = a[k-1];
           }
           a[j] = value;                   
           nElems++;                       
        }   
        
        // 删除方法
        public boolean delete(long value)
        {
            int j = find(value);
            if(j==nElems) {                 
               return false;
            }
            else {
               for(int k=j; k<nElems; k++) {
                  a[k] = a[k+1];
               }
               nElems--;                    
               return true;
            }
        }  
        
        // 二分法查找
        public int find(long searchKey) {
               int lowerBound = 0;
               int upperBound = nElems-1;
               int curIn;
            
               while(true) {
                  curIn = (lowerBound + upperBound ) / 2;
                  if(a[curIn]==searchKey) {
                     return curIn;              // found it
                  }
                  else if(lowerBound > upperBound) {
                     return nElems;             // can't find it
                  }
                  else {
                     if(a[curIn] < searchKey) {
                        lowerBound = curIn + 1; // it's in upper half
                     }
                     else {
                        upperBound = curIn - 1; // it's in lower half
                     }
                  }   
               }   
            }   
        
        public void display() {
            for(int j=0; j<nElems; j++) {        
               System.out.print(a[j] + " ");  
            }
            System.out.println("");
        }    
    }   
    
    class OrderedApp
    {
        public static void main(String[] args)
        {
            int maxSize = 100;              
            OrdArray arr;                   
            arr = new OrdArray(maxSize);    
            
            arr.insert(77);                
            arr.insert(99);
            arr.insert(44);
            arr.insert(55);
            arr.insert(22);
            arr.insert(88);
            arr.insert(11);
            arr.insert(00);
            arr.insert(66);
            arr.insert(33);
            
            int searchKey = 55;             
            if(arr.find(searchKey) != arr.size()) {
               System.out.println("Found " + searchKey);
            }
            else {
               System.out.println("Can't find " + searchKey);
            }
            
            arr.display();                  
            
            arr.delete(00);                 
            arr.delete(55);
            arr.delete(99);
            
            arr.display();                  
        }   
    }  
  • 相关阅读:
    CodeForces 19D Points (线段树+set)
    FZU 2105 Digits Count
    HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
    HDU 5634 Rikka with Phi (线段树)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
    Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
  • 原文地址:https://www.cnblogs.com/thlzhf/p/4024281.html
Copyright © 2011-2022 走看看