啪啪拉拉噼里啪啦

          初學(xué)者天堂資料匯集

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            16 隨筆 :: 73 文章 :: 16 評(píng)論 :: 0 Trackbacks

          2005年4月1日 #

          參考文獻(xiàn)
           1.C++Primer(第三版) Stanley B.Lippman, Josee Lajoie (中國(guó)電力出版社)
           2.C++語(yǔ)言程序設(shè)計(jì)(第二版) 鄭莉 董淵 (清華大學(xué)出版社)
           3.C++Primer Plus  Stephen Prata  (人民郵電出版社)
           4.C語(yǔ)言程序設(shè)計(jì) 譚浩強(qiáng)  清華大學(xué)出版社           

          C++是從C語(yǔ)言演變過來的,完全可以脫離C而從新學(xué)習(xí)C++

          #include<iostream.h>
          void main()
          {
            cout<<"welcome to C++ world !!"<<endl;
          }

          知識(shí)點(diǎn)1: *.h 文件被稱為頭文件.(標(biāo)準(zhǔn)的C++頭文件沒有后綴) 如iostream.h
                      2.*.C 習(xí)慣稱之為C程序文本文件.(在UNIX系統(tǒng)下則稱之為C++文件) C++程序文件的后綴在不同產(chǎn)品中則不同 如 *.CPP  *.CXX...類似的頭文件在C++的不同實(shí)現(xiàn)中也不相同.
                      3.#include 預(yù)處理器指示符
                      4.#include<> 和#include "   " 區(qū)別
                         #include<>是標(biāo)準(zhǔn)或者工程文件.  #include" " 表示當(dāng)前目錄下尋找.

          #ifdef   bookstore
          #define      bookstore
          #endif
          檢查bookstore是否在前面被定義了..
          #include<iostream.h>

          v1(int x,int y)
          {   cout<<"V1"<<endl;
              cout<<"{"<<endl;
           cout<<"x= "<<x<<endl;
           cout<<"y= "<<y<<endl;
           cout<<"}"<<endl;
          }

          v2(int x,int y)
          {   cout<<"V2"<<endl;
              cout<<"{"<<endl;
           cout<<"x= "<<x<<endl;
           cout<<"y= "<<y<<endl;
           cout<<"}"<<endl;
          }
          void main()
          {   int bug;
              #ifdef  bug
           cout<<"welcome to our  C++ world!!"<<endl;
           v1(2,5);
           v2(3,5);
          #endif
                     

          posted @ 2005-04-28 12:26 噼里啪啦的世界 閱讀(849) | 評(píng)論 (0)編輯 收藏

          只要有地區(qū)發(fā)展不平衡,就難以最終杜絕地區(qū)歧視。“窮”絕對(duì)不是一件好事,更不是美好道德的源泉,相反,它只是刺激普遍人性中的普遍弱點(diǎn):嫌貧愛富。

          深圳龍崗警方是政府所屬的執(zhí)法部門,今年3月份,竟在轄區(qū)內(nèi)懸掛橫幅“凡舉報(bào)河南籍團(tuán)伙敲詐勒索犯罪、破獲案件的獎(jiǎng)勵(lì)500元”,地區(qū)歧視赫然在目,令人難以置信。

          4月15日,兩位河南籍人士遠(yuǎn)在鄭州向龍崗警方提起司法訴訟,驚動(dòng)輿論,有朋友認(rèn)為此舉做秀,意在吸引眼球。我的看法是,即使做秀,此類官司也值得打,打得贏要打,打不贏也要打。只有人人形成“秋菊性格”,強(qiáng)勢(shì)部門才能在百姓面前低頭,兩者之間才有可能形成正常關(guān)系———“法律面前人人平等”。社會(huì)公正不是長(zhǎng)官恩賜的,也不是小民乞求的,而是一個(gè)一個(gè)“秋菊”起而抗議,一場(chǎng)一場(chǎng)官司“打”出來的。平民纏訟,尤其是纏強(qiáng)勢(shì)部門之訟,在過去要被譏諷為潑婦刁民、世風(fēng)日下,在現(xiàn)代恰恰是公民意識(shí)覺醒的標(biāo)志。

          但是,具體到地區(qū)歧視這一觀念,即使官司打贏了,河南人就能在全國(guó)改變他們被歧視的命運(yùn)嗎?我的看法不樂觀。原因在于,地區(qū)性歧視在人類社會(huì)生活中普遍存在,并不植根于知識(shí)分子容易想到的文化“基因”或“國(guó)民性”問題,而是植根于人性的普遍弱點(diǎn),這一弱點(diǎn)的起伏消長(zhǎng),是與社會(huì)發(fā)展不平衡聯(lián)系在一起的。

          我出生在上海,這個(gè)城市有一個(gè)公開秘密,也是這個(gè)城市的不文明標(biāo)記:全城歧視蘇北人。上個(gè)世紀(jì)50年代,有兩個(gè)強(qiáng)力因素對(duì)蘇北人有利,似乎能抵消這一地區(qū)歧視:接管這個(gè)城市的南下干部不少人操蘇北口音,來自蘇北紅區(qū);從1949年到1976年的國(guó)家總理周恩來,操一口淮陰口音,愛看江淮戲,蘇北得不能再蘇北,全國(guó)民眾家喻戶曉。事實(shí)證明,強(qiáng)力因素?zé)o濟(jì)于事,政治歸政治,歧視歸歧視,生活的“污泥濁水”照樣奔流。上海的市民生活并不隱諱這一現(xiàn)象,但與主流意識(shí)形態(tài)的階級(jí)論不合,官方出版物始終不能正視。倒是兩個(gè)外國(guó)人,一個(gè)來自美國(guó),一個(gè)來自德國(guó),對(duì)這一現(xiàn)象發(fā)生研究興趣,以此為題撰寫社會(huì)學(xué)博士論文,在學(xué)界頗得好評(píng),其中一位德國(guó)學(xué)者我還認(rèn)識(shí)。

          我插隊(duì)在河南,求學(xué)在西安。到西安后,發(fā)現(xiàn)一個(gè)城市奇觀:半城皆鄉(xiāng)音,滿目河南人。不久即發(fā)現(xiàn),河南人再多,在西安還是被歧視,原因很簡(jiǎn)單:他們大多是災(zāi)荒年景的流民,以及流民的后代。

          這時(shí)我才想起在河南的經(jīng)歷,被歧視者內(nèi)部,還有更細(xì)一層的地區(qū)歧視,豫西人看不起豫東人。原因也相通:豫東自然條件惡劣,一旦發(fā)生災(zāi)荒,豫東災(zāi)民順隴海線向西流動(dòng),先經(jīng)過豫西,后到達(dá)西安。而在上海,被歧視的蘇北人內(nèi)部也有類似現(xiàn)象:揚(yáng)州一帶的蘇北人看不起鹽城一代的蘇北人,甚至認(rèn)為蘇北人在上海的不良形象是被后者敗壞的。原因驚人地相似:一旦發(fā)生災(zāi)荒,鹽城阜寧一帶的災(zāi)民順運(yùn)河南下,先經(jīng)過揚(yáng)州,再渡江到上海。

          鹽、阜相比揚(yáng)州,不僅在地理上更“北方”,社會(huì)經(jīng)濟(jì)發(fā)展更落后,流民進(jìn)上海后能夠找到的職業(yè)更低賤,由此被認(rèn)為更“侉”,更粗野。發(fā)現(xiàn)地區(qū)歧視在中國(guó)普遍存在,一度使我心緒難平;再看到被歧視者內(nèi)部居然繼續(xù)劃分地區(qū)歧視,則使我沮喪無言。

          后來到哈佛大學(xué)短期訪問,發(fā)現(xiàn)地區(qū)歧視在美國(guó)白人內(nèi)部也存在。查爾斯河北畔的劍橋市,隱隱看不起河對(duì)岸波士頓地區(qū)的愛爾蘭人社區(qū)。我因?yàn)樨潏D房租便宜,恰好住進(jìn)了那個(gè)社區(qū),卻因?yàn)槁犃Σ缓茫瑢?shí)在聽不出一河之隔的英語(yǔ)有什么口音差異。我曾請(qǐng)一個(gè)愛爾蘭裔的美國(guó)教授林琪以放大的口型,夸張的口氣,演示她的祖籍口音,才勉強(qiáng)聽出一點(diǎn)差別。令我驚訝的是,那個(gè)地區(qū)受人尊崇的肯尼迪總統(tǒng),并不是出身在查爾斯河的北岸,而是遭人歧視的南岸,恰好就在愛爾蘭社區(qū)。他去世后,按美國(guó)規(guī)矩為前總統(tǒng)建立的肯尼迪圖書館就建在我住處不遠(yuǎn)的海邊,腳一抬就到,我曾無數(shù)次在那里留連。

          可惜總統(tǒng)歸總統(tǒng),歧視歸歧視,這就和周恩來的政治魅力無助于緩解上海對(duì)蘇北人的歧視差不多。林琪告訴我,這一歧視緣起19世紀(jì)中葉那場(chǎng)著名的馬鈴薯災(zāi)荒,愛爾蘭人大批來北美新英格蘭地區(qū)乞討求生,地位低下,招人嫌棄。20世紀(jì)90年代愛爾蘭總理訪美,還特意要求在哈佛廣場(chǎng)的空地上塑造一組饑民哀號(hào)求救的銅像,以紀(jì)念那個(gè)可怕年月。林琪還告訴我,隨著愛爾蘭社區(qū)社會(huì)經(jīng)濟(jì)發(fā)展,這一歧視正在淡化,相比她記事的童年時(shí)代,現(xiàn)在已經(jīng)好多了,幾乎可以忽略不計(jì),以致我要求她演示愛爾蘭口音時(shí),她沒有絲毫不快,而是以開玩笑的心態(tài)在講解一個(gè)歷史故事,以及地區(qū)歧視發(fā)生的根本原因了。

          只要有地區(qū)發(fā)展不平衡,就難以最終杜絕地區(qū)歧視。這是一個(gè)令人很不愉快的現(xiàn)實(shí),之所以不愉快,是因?yàn)樗罱K與一個(gè)“窮”字相連接。“窮”絕對(duì)不是一件好事,更不是美好道德的源泉,相反,它只是刺激普遍人性中的普遍弱點(diǎn):嫌貧愛富。普遍人性普遍存在,地不分東、西,人不分黃、白,只要有地區(qū)發(fā)展不平衡,就會(huì)有河南人問題,蘇北人問題,乃至愛爾蘭人問題。而愛爾蘭人故事告訴我們的是:地區(qū)歧視當(dāng)然不可取,更不能放縱這一觀念蔓延到執(zhí)法、司法行為,但只有從根本上消除地區(qū)發(fā)展的失衡,才能最終消解這一丑惡觀念。在這個(gè)意義上,我贊成“發(fā)展才是硬道理”,只是這個(gè)發(fā)展不能僅限于經(jīng)濟(jì),應(yīng)該包括文化,文化發(fā)展中最重要的一環(huán)不是改造“國(guó)民性”,而是實(shí)施實(shí)實(shí)在在的教育機(jī)會(huì)平等;還應(yīng)該包括政治發(fā)展,政治發(fā)展中最重要一環(huán)是司法公正,在最終克服地區(qū)發(fā)展不平衡之前,首先要做到也可以做到的,是“法律面前人人平等”。

          作者:上海大學(xué)文學(xué)院教授朱學(xué)勤黃華

          posted @ 2005-04-24 22:06 噼里啪啦的世界 閱讀(1095) | 評(píng)論 (0)編輯 收藏

          import java.io.*;
          public class application01
          {
           
           public static void main(String[] args)
           {   char c=' ' ;
              String s="";
            System.out.println("Enter a character Please ");
            try
            { 
             BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
             s=in.readLine();
            // c=(char)System.in.read();
            } catch(IOException e){};
            System.out.println("you''ve a  "+s);
            
           }
           
          }


            in= new BufferedReader(new InputStreamReader(System.in));
             s=in.readLi BufferedReader ne();
          posted @ 2005-04-17 07:31 噼里啪啦的世界 閱讀(966) | 評(píng)論 (0)編輯 收藏

          import java.applet.*;
          import java.awt.*;
          import java.awt.event.*;
          public class myjava01 extends Applet implements ActionListener
          {
           Label  p1;
           TextField input,output;
           public void init()
           {
            p1=new Label("請(qǐng)輸入您的名字");
                  input=new TextField(10);
               output=new TextField(50);
            add(p1);
            add(input);
            add(output);
            input.addActionListener(this);
           }
           public void actionPerformed(ActionEvent e)
           {
                 output.setText(input.getText()+",welcome to our world");
               }
          }



          本程序知識(shí)點(diǎn):
          程序需要加載三個(gè)包
          import java.awt.event.*;
          import java.awt.*;
          import java.applet.*;
          凡是java.applet程序的 必須加載java.applet.* 包
          凡是使用圖形界面的    必須加載Java.awt包
          凡是使用圖形界面事件處理的 必須加載java.awt.event.*包

          程序定義的一個(gè)類,必須始Applet的子類 例如
          public class Applet01 extends  Applet  implements Actionlistener
          implements Actionlistener 還是一個(gè)動(dòng)作事件的Action的監(jiān)聽者。

          init()是建立一個(gè)對(duì)象
          并用ADD() 加載到圖形界面中。。
          input.addActionListener(this) 注冊(cè)到監(jiān)聽者 否則程序不能響應(yīng)回車鍵
          定義了一個(gè)acctionPerformed()方法。。。

          posted @ 2005-04-17 06:45 噼里啪啦的世界 閱讀(761) | 評(píng)論 (1)編輯 收藏

          jsp:include              頁(yè)面請(qǐng)求時(shí)候 引入一個(gè)文件
          jsp:usebean             尋找一個(gè)或?qū)嵗粋€(gè)javabean
          jsp:getProperty       輸出JVAVBEAN的屬性
          jsp:forward            把請(qǐng)求轉(zhuǎn)為一個(gè)新的頁(yè)面
          jsp:plugin                根據(jù)瀏覽器類型為java插件設(shè)置object 或Embed
          jsp:setProperty       設(shè)置JAVABEAN的屬性
          posted @ 2005-04-12 23:30 噼里啪啦的世界 閱讀(607) | 評(píng)論 (0)編輯 收藏

          常用的類
          BufferedReader
          BufferedWriter
          FileReader
          FileWirter
          String
          Integer

          常用的包
          java.lang
          java.awt
          java.io
          java.util
          java.sql
          常用的接口
          Remote
          List
          Map
          Doucment
          Nodelist
          posted @ 2005-04-12 23:23 噼里啪啦的世界 閱讀(1010) | 評(píng)論 (0)編輯 收藏

          標(biāo)準(zhǔn)建模語(yǔ)言UML,
          提供了 例圖,靜態(tài)圖(類圖,對(duì)象圖,包圖),行為圖,交互圖(順序圖,合作圖) 實(shí)現(xiàn)圖

          posted @ 2005-04-12 23:17 噼里啪啦的世界 閱讀(613) | 評(píng)論 (1)編輯 收藏

          JAVA DATA OBJECT... java對(duì)象持久化的新規(guī)范。
          存取某種數(shù)據(jù)倉(cāng)庫(kù)中對(duì)象標(biāo)準(zhǔn)API  JDO提供透明的對(duì)象存儲(chǔ)。。。
          JDBC是面向關(guān)系的數(shù)據(jù)庫(kù)JDO更通用。
          posted @ 2005-04-12 23:14 噼里啪啦的世界 閱讀(744) | 評(píng)論 (0)編輯 收藏

          Struts 是基于JAVASERVELET/JSP技術(shù)的 web開發(fā)的開放源代碼的framwork。。。
          是基于MVC( MODEL-VIEW-CONTROLLER) 設(shè)計(jì)模式的應(yīng)用架構(gòu)
          1。包含一個(gè)controller servlet 能夠把用戶的請(qǐng)求發(fā)送到一個(gè)對(duì)應(yīng)的Action對(duì)象
          2。包含了自用的tag庫(kù)。提供controller servlet 提供聯(lián)機(jī)幫戶 幫助開發(fā)人員創(chuàng)建交互式表單
          3。提供一些列使用對(duì)象。如 xml處理等。 java reflection APIS自動(dòng)處理javabean

          posted @ 2005-04-12 23:10 噼里啪啦的世界 閱讀(602) | 評(píng)論 (0)編輯 收藏

          快速排序(QuickSort)

          1、算法思想
               快速排序是C.R.A.Hoare于1962年提出的一種劃分交換排序。它采用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。

          (1) 分治法的基本思想
               分治法的基本思想是:將原問題分解為若干個(gè)規(guī)模更小但結(jié)構(gòu)與原問題相似的子問題。遞歸地解這些子問題,然后將這些子問題的解組合為原問題的解。

          (2)快速排序的基本思想
               設(shè)當(dāng)前待排序的無序區(qū)為R[low..high],利用分治法可將快速排序的基本思想描述為:
          ①分解:
             
           在R[low..high]中任選一個(gè)記錄作為基準(zhǔn)(Pivot),以此基準(zhǔn)將當(dāng)前無序區(qū)劃分為左、右兩個(gè)較小的子區(qū)間R[low..pivotpos-1)和R[pivotpos+1..high],并使左邊子區(qū)間中所有記錄的關(guān)鍵字均小于等于基準(zhǔn)記錄(不妨記為pivot)的關(guān)鍵字pivot.key,右邊的子區(qū)間中所有記錄的關(guān)鍵字均大于等于pivot.key,而基準(zhǔn)記錄pivot則位于正確的位置(pivotpos)上,它無須參加后續(xù)的排序。
            注意:
               劃分的關(guān)鍵是要求出基準(zhǔn)記錄所在的位置pivotpos。劃分的結(jié)果可以簡(jiǎn)單地表示為(注意pivot=R[pivotpos]):
               R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
                            其中l(wèi)ow≤pivotpos≤high。
          ②求解:
              
          通過遞歸調(diào)用快速排序?qū)ψ蟆⒂易訁^(qū)間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
          ③組合:
             
           因?yàn)楫?dāng)"求解"步驟中的兩個(gè)遞歸調(diào)用結(jié)束時(shí),其左、右兩個(gè)子區(qū)間已有序。對(duì)快速排序而言,"組合"步驟無須做什么,可看作是空操作。

          2、快速排序算法QuickSort
            void QuickSort(SeqList R,int low,int high)
             { //對(duì)R[low..high]快速排序
               int pivotpos; //劃分后的基準(zhǔn)記錄的位置
               if(low<high){//僅當(dāng)區(qū)間長(zhǎng)度大于1時(shí)才須排序
                  pivotpos=Partition(R,low,high); //對(duì)R[low..high]做劃分
                  QuickSort(R,low,pivotpos-1); //對(duì)左區(qū)間遞歸排序
                  QuickSort(R,pivotpos+1,high); //對(duì)右區(qū)間遞歸排序
                }
              } //QuickSort

            注意:
               為排序整個(gè)文件,只須調(diào)用QuickSort(R,1,n)即可完成對(duì)R[l..n]的
          posted @ 2005-04-01 07:18 噼里啪啦的世界 閱讀(675) | 評(píng)論 (0)編輯 收藏

          交換排序的基本思想是:兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個(gè)記錄的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的記錄為止。
               應(yīng)用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。

          冒泡排序

          1、排序方法

               將被排序的記錄數(shù)組R[1..n]垂直排列,每個(gè)記錄R[i]看作是重量為R[i].key的氣泡。根據(jù)輕氣泡不能在重氣泡之下的原則,從下往上掃描數(shù)組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復(fù)進(jìn)行,直到最后任何兩個(gè)氣泡都是輕者在上,重者在下為止。
          (1)初始
               R[1..n]為無序區(qū)。

          (2)第一趟掃描
               從無序區(qū)底部向上依次比較相鄰的兩個(gè)氣泡的重量,若發(fā)現(xiàn)輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對(duì)于每對(duì)氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內(nèi)容。
               第一趟掃描完畢時(shí),"最輕"的氣泡就飄浮到該區(qū)間的頂部,即關(guān)鍵字最小的記錄被放在最高位置R[1]上。

          (3)第二趟掃描

               掃描R[2..n]。掃描完畢時(shí),"次輕"的氣泡飄浮到R[2]的位置上……
               最后,經(jīng)過n-1 趟掃描可得到有序區(qū)R[1..n]
            注意:
               第i趟掃描時(shí),R[1..i-1]和R[i..n]分別為當(dāng)前的有序區(qū)和無序區(qū)。掃描仍是從無序區(qū)底部向上直至該區(qū)頂部。掃描完畢時(shí),該區(qū)中最輕氣泡飄浮到頂部位置R[i]上,結(jié)果是R[1..i]變?yōu)樾碌挠行騾^(qū)。

          2、冒泡排序過程示例
               對(duì)關(guān)鍵字序列為49 38 65 97 76 13 27 49的文件進(jìn)行冒泡排序的過程【參見動(dòng)畫演示

          3、排序算法
          (1)分析
               因?yàn)槊恳惶伺判蚨际褂行騾^(qū)增加了一個(gè)氣泡,在經(jīng)過n-1趟排序之后,有序區(qū)中就有n-1個(gè)氣泡,而無序區(qū)中氣泡的重量總是大于等于有序區(qū)中氣泡的重量,所以整個(gè)冒泡排序過程至多需要進(jìn)行n-1趟排序。
               若在某一趟排序中未發(fā)現(xiàn)氣泡位置的交換,則說明待排序的無序區(qū)中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序后終止。為此,在下面給出的算法中,引入一個(gè)布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發(fā)生了交換,則將其置為TRUE。各趟排序結(jié)束時(shí)檢查exchange,若未曾發(fā)生過交換則終止算法,不再進(jìn)行下一趟排序。

          (2)具體算法

            void BubbleSort(SeqList R)
             { //R(l..n)是待排序的文件,采用自下向上掃描,對(duì)R做冒泡排序
               int i,j;
               Boolean exchange; //交換標(biāo)志
               for(i=1;i<n;i++){ //最多做n-1趟排序
                 exchange=FALSE; //本趟排序開始前,交換標(biāo)志應(yīng)為假
                 for(j=n-1;j>=i;j--) //對(duì)當(dāng)前無序區(qū)R[i..n]自下向上掃描
                  if(R[j+1].key<R[j].key){//交換記錄
                    R[0]=R[j+1]; //R[0]不是哨兵,僅做暫存單元
                    R[j+1]=R[j];
                    R[j]=R[0];
                    exchange=TRUE; //發(fā)生了交換,故將交換標(biāo)志置為真
                   }
                 if(!exchange) //本趟排序未發(fā)生交換,提前終止算法
                       return;
               } //endfor(外循環(huán))
              } //BubbleSort
          posted @ 2005-04-01 07:17 噼里啪啦的世界 閱讀(292) | 評(píng)論 (0)編輯 收藏

           希爾排序(Shell Sort)是插入排序的一種。因D.L.Shell于1959年提出而得名。

          希爾排序基本思想

            基本思想:
               先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把文件的全部記錄分成d1個(gè)組。所有距離為dl的倍數(shù)的記錄放在同一個(gè)組中。先在各組內(nèi)進(jìn)行直接插人排序;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?BR>     該方法實(shí)質(zhì)上是一種分組插入方法。

          給定實(shí)例的shell排序的排序過程

               假設(shè)待排序文件有10個(gè)記錄,其關(guān)鍵字分別是:
                  49,38,65,97,76,13,27,49,55,04。
               增量序列的取值依次為:
                  5,3,1
               排序過程如【動(dòng)畫模擬演示】。

          Shell排序的算法實(shí)現(xiàn)

          1. 不設(shè)監(jiān)視哨的算法描述

            void ShellPass(SeqList R,int d)
             {//希爾排序中的一趟排序,d為當(dāng)前增量
               for(i=d+1;i<=n;i++) //將R[d+1..n]分別插入各組當(dāng)前的有序區(qū)
                 if(R[i].key<R[i-d].key){
                   R[0]=R[i];j=i-d; //R[0]只是暫存單元,不是哨兵
                   do {//查找R[i]的插入位置
                      R[j+d];=R[j]; //后移記錄
                      j=j-d; //查找前一記錄
                   }while(j>0&&R[0].key<R[j].key);
                   R[j+d]=R[0]; //插入R[i]到正確的位置上
                 } //endif
             } //ShellPass

            void  ShellSort(SeqList R)
             {
              int increment=n; //增量初值,不妨設(shè)n>0
              do {
                    increment=increment/3+1; //求下一增量
                    ShellPass(R,increment); //一趟增量為increment的Shell插入排序
                 }while(increment>1)
              } //ShellSort
            注意:
               當(dāng)增量d=1時(shí),ShellPass和InsertSort基本一致,只是由于沒有哨兵而在內(nèi)循環(huán)中增加了一個(gè)循環(huán)判定條件"j>0",以防下標(biāo)越界。

          2.設(shè)監(jiān)視哨的shell排序算法
               具體算法【參考書目[12] 】

          算法分析

          1.增量序列的選擇

               Shell排序的執(zhí)行時(shí)間依賴于增量序列。
               好的增量序列的共同特征:
            ① 最后一個(gè)增量必須為1;
            ② 應(yīng)該盡量避免序列中的值(尤其是相鄰的值)互為倍數(shù)的情況。
               有人通過大量的實(shí)驗(yàn),給出了目前較好的結(jié)果:當(dāng)n較大時(shí),比較和移動(dòng)的次數(shù)約在nl.25到1.6n1.25之間。

          2.Shell排序的時(shí)間性能優(yōu)于直接插入排序
               希爾排序的時(shí)間性能優(yōu)于直接插入排序的原因:
            ①當(dāng)文件初態(tài)基本有序時(shí)直接插入排序所需的比較和移動(dòng)次數(shù)均較少。
            ②當(dāng)n值較小時(shí),n和n2的差別也較小,即直接插入排序的最好時(shí)間復(fù)雜度O(n)和最壞時(shí)間復(fù)雜度0(n2)差別不大。
            ③在希爾排序開始時(shí)增量較大,分組較多,每組的記錄數(shù)目少,故各組內(nèi)直接插入較快,后來增量di逐漸縮小,分組數(shù)逐漸減少,而各組的記錄數(shù)目逐漸增多,但由于已經(jīng)按di-1作為距離排過序,使文件較接近于有序狀態(tài),所以新的一趟排序過程也較快。
               因此,希爾排序在效率上較直接插人排序有較大的改進(jìn)。

          3.穩(wěn)定性
               希爾排序是不穩(wěn)定的。參見上述實(shí)例,該例中兩個(gè)相同關(guān)鍵字49在排序前后的相對(duì)次序發(fā)生了變化。
          posted @ 2005-04-01 07:16 噼里啪啦的世界 閱讀(178) | 評(píng)論 (0)編輯 收藏

          插入排序(Insertion Sort)的基本思想是:每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子文件中的適當(dāng)位置,直到全部記錄插入完成為止。
               本節(jié)介紹兩種插入排序方法:直接插入排序和希爾排序。

          直接插入排序基本思想

          1、基本思想

               假設(shè)待排序的記錄存放在數(shù)組R[1..n]中。初始時(shí),R[1]自成1個(gè)有序區(qū),無序區(qū)為R[2..n]。從i=2起直至i=n為止,依次將R[i]插入當(dāng)前的有序區(qū)R[1..i-1]中,生成含n個(gè)記錄的有序區(qū)。

          2、第i-1趟直接插入排序:
               通常將一個(gè)記錄R[i](i=2,3,…,n-1)插入到當(dāng)前的有序區(qū),使得插入后仍保證該區(qū)間里的記錄是按關(guān)鍵字有序的操作稱第i-1趟直接插入排序。
               排序過程的某一中間時(shí)刻,R被劃分成兩個(gè)子區(qū)間R[1..i-1](已排好序的有序區(qū))和R[i..n](當(dāng)前未排序的部分,可稱無序區(qū))。
               直接插入排序的基本操作是將當(dāng)前無序區(qū)的第1個(gè)記錄R[i]插人到有序區(qū)R[1..i-1]中適當(dāng)?shù)奈恢蒙希筊[1..i]變?yōu)樾碌挠行騾^(qū)。因?yàn)檫@種方法每次使有序區(qū)增加1個(gè)記錄,通常稱增量法。
               插入排序與打撲克時(shí)整理手上的牌非常類似。摸來的第1張牌無須整理,此后每次從桌上的牌(無序區(qū))中摸最上面的1張并插入左手的牌(有序區(qū))中正確的位置上。為了找到這個(gè)正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

          一趟直接插入排序方法

          1.簡(jiǎn)單方法

               首先在當(dāng)前有序區(qū)R[1..i-1]中查找R[i]的正確插入位置k(1≤k≤i-1);然后將R[k..i-1]中的記錄均后移一個(gè)位置,騰出k位置上的空間插入R[i]。
            注意:
               若R[i]的關(guān)鍵字大于等于R[1..i-1]中所有記錄的關(guān)鍵字,則R[i]就是插入原位置。

          2.改進(jìn)的方法
            一種查找比較操作和記錄移動(dòng)操作交替地進(jìn)行的方法。
          具體做法:
               將待插入記錄R[i]的關(guān)鍵字從右向左依次與有序區(qū)中記錄R[j](j=i-1,i-2,…,1)的關(guān)鍵字進(jìn)行比較:
               ① 若R[j]的關(guān)鍵字大于R[i]的關(guān)鍵字,則將R[j]后移一個(gè)位置;
                ②若R[j]的關(guān)鍵字小于或等于R[i]的關(guān)鍵字,則查找過程結(jié)束,j+1即為R[i]的插入位置。
               關(guān)鍵字比R[i]的關(guān)鍵字大的記錄均已后移,所以j+1的位置已經(jīng)騰空,只要將R[i]直接插入此位置即可完成一趟直接插入排序。

          直接插入排序算法

          1.算法描述

            void lnsertSort(SeqList R)
             { //對(duì)順序表R中的記錄R[1..n]按遞增序進(jìn)行插入排序
              int i,j;
              for(i=2;i<=n;i++) //依次插入R[2],…,R[n]
                if(R[i].key<R[i-1].key){//若R[i].key大于等于有序區(qū)中所有的keys,則R[i]
                                        //應(yīng)在原有位置上
                  R[0]=R[i];j=i-1; //R[0]是哨兵,且是R[i]的副本
                  do{ //從右向左在有序區(qū)R[1..i-1]中查找R[i]的插入位置
                   R[j+1]=R[j]; //將關(guān)鍵字大于R[i].key的記錄后移
                   j-- ;
                   }while(R[0].key<R[j].key); //當(dāng)R[i].key≥R[j].key時(shí)終止
                  R[j+1]=R[0]; //R[i]插入到正確的位置上
                 }//endif
             }//InsertSort

          posted @ 2005-04-01 07:15 噼里啪啦的世界 閱讀(329) | 評(píng)論 (0)編輯 收藏

          1.選擇排序
             選擇排序(Selection Sort)的基本思想是:每一趟從待排序的記錄中選出關(guān)鍵字最小的記錄,順序放在已排好序的子文件的最后,直到全部記錄排序完畢。
               常用的選擇排序方法有直接選擇排序和堆排序。

          直接選擇排序(Straight Selection Sort)

          1、直接選擇排序的基本思想

               n個(gè)記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果:
           ①初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空。
           ②第1趟排序
               在無序區(qū)R[1..n]中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個(gè)記錄R[1]交換,使R[1..1]和R[2..n]分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū)。
            ……
           ③第i趟排序
            第i趟排序開始時(shí),當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當(dāng)前無序區(qū)中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個(gè)記錄R[i]交換,使R[1..i]和R[i+1..n]分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū)。
               這樣,n個(gè)記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。

          2、直接選擇排序的過程
            對(duì)初始關(guān)鍵字為49、38、65、97、76、13、27和49的文件進(jìn)行直接選擇排序的過程【參見動(dòng)畫演示

          3、算法描述
            直接選擇排序的具體算法如下:
           void SelectSort(SeqList R)
           {
             int i,j,k;
             for(i=1;i<n;i++){//做第i趟排序(1≤i≤n-1)
               k=i;
               for(j=i+1;j<=n;j++) //在當(dāng)前無序區(qū)R[i..n]中選key最小的記錄R[k]
                 if(R[j].key<R[k].key)
                   k=j; //k記下目前找到的最小關(guān)鍵字所在的位置
                 if(k!=i){ //交換R[i]和R[k]
                   R[0]=R[i];R[i]=R[k];R[k]=R[0]; //R[0]作暫存單元
                  } //endif
               } //endfor
            } //SeleetSort

          4、算法分析
          (1)關(guān)鍵字比較次數(shù)
               無論文件初始狀態(tài)如何,在第i趟排序中選出最小關(guān)鍵字的記錄,需做n-i次比較,因此,總的比較次數(shù)為:
               n(n-1)/2=0(n2)

          (2)記錄的移動(dòng)次數(shù)
               當(dāng)初始文件為正序時(shí),移動(dòng)次數(shù)為0
               文件初態(tài)為反序時(shí),每趟排序均要執(zhí)行交換操作,總的移動(dòng)次數(shù)取最大值3(n-1)。
               直接選擇排序的平均時(shí)間復(fù)雜度為O(n2)。

          (3)直接選擇排序是一個(gè)就地排序

          (4)穩(wěn)定性分析
               直接選擇排序是不穩(wěn)定的

          2.冒泡排序
          3.字符轉(zhuǎn)換
          posted @ 2005-04-01 07:15 噼里啪啦的世界 閱讀(701) | 評(píng)論 (2)編輯 收藏

          1 什么叫作用域?什么叫局部變量?什么叫全局變量?、
          作用域是一個(gè)標(biāo)識(shí)符在程序正文中有效的的區(qū)域。
          局部變量具有塊作用域的變量
          全局變量具有文件作用域的變量

          變量有那幾種存儲(chǔ)類型

          auto  采用堆棧方式分配內(nèi)存空間,屬于暫時(shí)性存儲(chǔ),其存儲(chǔ)空間可以被若干變量多次覆蓋使用
          register 存儲(chǔ)類型  存放在寄存器中
          extern  所有程序和函數(shù)段都可引用
          static  在內(nèi)存中固定地址存放 整個(gè)程序運(yùn)行期間都有效。。
          posted @ 2005-04-01 07:08 噼里啪啦的世界 閱讀(125) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 聂荣县| 西宁市| 大同县| 新民市| 深泽县| 汶上县| 乌什县| 平顺县| 林甸县| 洞头县| 三穗县| 潼南县| 临猗县| 河西区| 南宫市| 临漳县| 阿鲁科尔沁旗| 湖南省| 偃师市| 五指山市| 罗田县| 本溪市| 布拖县| 福州市| 拜泉县| 新和县| 云霄县| 射洪县| 集安市| 江永县| 高尔夫| 濮阳县| 得荣县| 遵化市| 进贤县| 荣昌县| 凭祥市| 册亨县| 资中县| 陇西县| 布尔津县|