




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
銷售人員面試問題精選
一、口頭表達能力(注意語言邏輯性、用語修辭度、口頭禪、語言波幅等)
1、請您先用3-5分鐘左右的時間介紹一下自己吧!
2、您先說說您最近服務的這家公司(由簡歷而定)的基本情況吧(規模、產品、市場)
3、您在目前工作崗位中主要有哪些工作內容?主要的顧客有哪些?
4、請您簡要介紹一下自己的求學經歷。
5、請您簡要介紹一下自己的成長歷程。
二、靈活應變能力(也涉及工作態度)
1、您為何要離開目前服務的這家公司?(答案可能是待遇或成長空間或人際氛圍或其它,待回答完畢后繼續發問)`
——您跟您的主管或直接上司有沒有針對以上問題溝通過?(如果沒有,問其原因;如果有,問其過程和結果)
2、除了簡歷上的工作經歷,您還會去關注哪些領域(或有沒有其它潛在的興趣或是否想過去嘗試、從事的其它職業)?
——(若有,繼續發問)您覺得這跟您目前要從事的職業有哪些利、弊關系?
——(若無,繼續發問)您不覺得您的知識結構有些狹窄或興趣較貧乏,說說未來的改善計劃?
3、您在選擇工作中更看重的是什么?(可能是成長空間、培訓機會、發揮平臺、薪酬等答案)
(若薪酬不排在第一,問)——您可不可以說說你在薪酬方面的心理預期?(待回答完畢后)那您剛才的意思也可以這樣理解:薪酬方面可以適當低于您的心理預期,對嗎?(若薪酬顯得不太讓步,可問)有人說掙未來比掙錢更為重要,您怎樣理解?
(若薪酬排在第一,問)——有人說掙未來比掙錢更為重要,您怎樣理解?
4、您覺得您在以前類似于我司提供的這個崗位上的工作經歷中有哪些方面做得不足?
(若答有,問)——您打算在以后的工作中采取哪些改善措施?(待回答完畢后,繼續發問)您再想想如果到我們公司來任職還有沒有補充改善措施?
(若答無,問)——您好像不太連續去追求卓越,您認為您能勝任我們提供給您的這份工作嗎?
5、您認為《致加西亞的信》中的羅文和推薦羅文的加西加將軍哪一個對企業更為重要?
——(若答羅文,問)您不認為現在的企業面臨著“千里馬常有,而伯樂不常有的狀態嗎”?
——(若答加西亞,問其理由)
——(若答兩者兼有,問其理由).三、興趣愛好(知識廣博度)
1、您工作之余有哪些興趣愛好?興趣中有沒有比較拿手的?2、您在大學所設的專業課中最感興趣的是哪一門?(待回答完畢,問)談談您對所在興趣的相關看法。)
3、您是怎樣理解自然科學(比如數學)與社會科學(比如說政治經濟學)之間關系的或者說兩者有何異同?
4、就您個人的理解說說您對我們公司所處行業的前景和生存途徑。
6、談談您目前想去學習或彌補的知識。
7、如果讓您重新選擇一次,您對自己的專業領域會有所改變嗎?
四、情緒控制力(壓力承受力)
1、我們的工作與生活歷程并不是一帆風順的,談談您的工作或生活或求學經歷中出現的挫折或低潮期,您是如何克服的?
(如果回答無此經歷,問)——您的生活是不是太過于順暢,成長中往往伴隨著失敗,您覺得自己的成長來自于哪些方面?
2、請您舉一個您親身經歷的事例來說明您對困難或挫折有一定的承受力?
3、假如你的上司是一個非常嚴厲、領導手腕強硬,時常給您巨大壓力的人,您覺得這種領導方式對您有何利弊?.
4、您的領導給您布置了一項您以前從未觸及過的任務,您打算如何去完成它?(如果有類似的經歷說說完成的經歷。
5、您有沒有過失業或暫時待業經歷,談談那時的生活態度和心情狀態。
6、您有沒有過在感情上的失敗或不順利經歷,它對您那時和現在的生活有什么樣的影響?
7、假如您喜歡上了一個人,但您對他(她)表白后受到拒絕并說你們是不可能的,拒絕的原因是她已有男朋友,但她也并不討厭你,接著您將采取什么行動?
8、假如在公眾場合中,有一個人有意當眾揭您的短處或您的隱私,您怎樣去處理?
9、談談您以往職業生涯中最有壓力的一、兩件事,并說說是如何克服的。
10、談談您以往職業生涯中令您有成就感的一、兩件事,并說說它給您的啟示。
五、上進心與自信心
1、談談您求學經歷中令您感到成功的事例及成功的因素。
2、說說您對成功的看法。
3、您認為自己有什么資格來勝任這份工作?
4、說說您未來3-5年的職業定位計劃。
5、您如何看待學校的學習與工作中的學習的區別。
6、談談您最近的充電經歷,并說說它對您的益處。
7、您怎樣看待游戲中的輸贏。
8、談談您認真追求過的一件事或一個人,并說說過程和結果。
9、有人說:滿足感÷欲望=幸福或成功,即幸福是個人偏好的滿足程度,舉例來說,一個兒女滿堂、子女孝敬的老人他認為自己與李嘉誠有同樣的成功感,您怎樣理解。
六、責任感與歸屬意識
1、請描述一下您以往所就職公司中您認為最適合您自己的企業文化的特點。
2、您的下屬未按期完成您所布置給他的任務,如果您的上司責怪下來,您認為這是誰的責任,為什么?
3、描述一下您對上司所布置任務的完成思想與過程。
4、當您所在的集體處于競爭劣勢時,您有什么想法和行動?5、往往跨組織的任務中,由于涉及過多成員,最后易形成“責任者缺位”現象,您如果身處其境,會是什么心態?
6、您每一次離職時有沒有過失落感?您跟過去就職過的公司的一、兩個上司或同事還有聯系嗎?并說說他們目前的處境。
七、影響他人的能力
如果你是某事的負責人的話,你很容易讓他人聽你的;但是,當你不是負責人時,讓別人聽自己的話是非常難的事。想要培養自己影響他人的能力的話,得通過與他人的共同的理想和目標來建立個人關系。那些擁有影響力并能感召他人的應聘者通常能夠使同事和客戶支持自己的觀點和目標。下面的一些問題能夠考核出應聘者在這方面的能力。
1、請你舉一例說明你曾經使某人做他并不喜歡做的事情。
2、請描述一下這樣一個經歷:你使別人參與、支持你的工作,并最終達到了預期目的。
3、假設你發現你的一位工友做了不道德的事情,你會采取什么樣的方法來使這位工友改正他的不道德行為?
4、假如管理層要對工作程序進行調整,這會對你的工作造成危害。你會采取什么辦法來說服管理層不要這樣做?
5、請說說你的這樣一個經歷:你的一位老板總是在最后一刻才給你布置工作任務。你采取什么辦法來改變老板的這種工作方法?
6、我想知道你是怎樣使某位雇員來承擔更多的責任,或承擔他本人認為很難的工作的?
7、我想知道你是否遇見這樣的情形:部門的某位員工不愿意干自己的工作。你采取什么措施來改變這種情況的?
8、請說一下你是否想出過某種能夠解決你所在部門問題的主意?你是怎樣把你的想法推銷給你的老板的?
9、講講這樣的一個經歷:你向員工推出了一個很不受歡迎的想法,你采用什么辦法來減少員工對這一想法的反感?
10、描述一下這樣一種經歷:你手下有一位表現平平的員工。你采用了什么辦法來提高他的工作效率?八、有效的溝通技能
溝通是很重要的一部分,尤其對于銷售人員。面試是考核人的溝通能力的很好的辦法。面試中,你有機會了解應聘者表達的思想是否具有說服力,概念描述得是否清楚,思路是否有條理,用詞是否準確,是否能吸引聽者的注意力,以及應聘者是否能保持與對方的視線,等等。下面一些問題主要用來測試應聘者的溝通技能。
1、請講一個這樣的情形:某人說話不清,但是你還必須聽他的話,你怎樣回答他的問題才好?
2、一個好的溝通者應該具備哪些條件?
3、請說一下別人是怎樣看你的?
4、請你講一下和一個有非常糟糕習慣的人在一起工作的經歷。你是怎樣使對方改變他的不良行為的?
5、若讓你在公司董事會上發言,你該怎樣準備發言稿?6、我想知道你曾經遇到的最有挑戰性的溝通方面的問題。你為什么認為那次經歷對你最富有挑戰性,你是怎樣應對的?7、你認為最困難的溝通的問題是什么?為什么?8、你認為良好溝通的關鍵是什么?
9、假如你的兩個同事的沖突已經影響到整個團隊,讓你去調節沖突,并使沖突雙方能夠自己解決問題,你會怎樣做?九、銷售能力
在公司所有工作中,銷售人員的工作可謂最復雜。這也許是因為,客戶在購買公司的產品前,首先購買的是銷售人員的服務。還可能是因為銷售方法過去10年里從廣告到咨詢服務都發生了巨大變化。也可能是因為好的銷售人員需要掌握很多相反甚至自相矛盾的技能:(1)聽說能力;(2)產品知識和人的品味;(3)銷售策略和市場滲入策略;(4)具有說服力,但又不使用花招的溝通能力;(5)既有取得較好個人業績的欲望,又有服務客戶的強烈意識;(6)富于彈性,又講原則;(7)做事積極主動,又善于和他人合作。下面一些問題可以評估應聘者在這方面的能力。
1、請講講你遇到的最困難的銷售經歷,你是怎樣勸說客戶購買你的產品的?
2、人們購買產品的三個主要原因是什么?
3、關于我們的產品生產線和我們的客戶群體,你了解多少?4、關于銷售,你最喜歡和最不喜歡的是什么?為什么?5、若受到獎勵,你有什么感想?
6、你最典型的一個工作日是怎樣安排的?
7、為取得成功,一個好的銷售人員應該具備哪四方面的素質?你為什么認為這些素質是十分重要的?
8、電話推銷和面對面的推銷有什么區別?為使電話推銷成功,需要什么樣的特殊技能和技巧?
9、在你的前任工作中,你用什么方法來發展并維持業已存在的客戶的?
10、你給新員工上一堂銷售課程,你在課堂上要講些什么?為什么?
11、請講一下你在前任工作中所使用的最典型的銷售方法和技巧。
12、講一個這樣的經歷:給你定的銷售任務很大,完成任務的時間又很短,你用什么辦法以確保達到銷售任務目標的?
13、你是否有超額完成銷售目標的時候,你是怎樣取得這樣績的?
14、一般而言,從和客戶接觸到最終銷售的完成需要多長時間?這個時間周期怎樣才能縮短?
15、你怎樣才能把一個偶然的購買你產品的人變成經常購買的人?
16、當你接管了一個新的行銷區或一新的客戶群時,怎樣才能使這些人成為你的固定客戶?
17、在打推銷電話時,提前要做哪些準備?18、你怎樣處理與銷售活動無關的書面工作?
19、請向我推銷一下這支鉛筆。
20、你認為推銷電話最重要的特點是什么?為什么?
21、和業已存在的老客戶打交道,以及和新客戶打交道,你更喜歡那種?為什么?
22、如果某位客戶一直在購買和你的產品相似,但價格卻很低于你的產品,你該怎樣說服這個客戶購買你的產品?
23、具備什么樣的素質和技能才能使你從眾多的銷售人員中脫穎而出?
24、假如你遇到這樣一種情況:你的產品和服務的確是某公司需要的,但是那個公司內部很多人士強烈要求購買質量差一些但價格便宜的同種產品。客戶征求你的意見,你該怎樣說?面試時的Java數據結構與算法查找和排序算法是算法的入門知識,其經典思想可以用于很多算法當中。因為其實現代碼較短,應用較常見。所以在面試中經常會問到排序算法及其相關的問題。但萬變不離其宗,只要熟悉了思想,靈活運用也不是難事。一般在面試中最常考的是快速排序和歸并排序,并且經常有面試官要求現場寫出這兩種排序的代碼。對這兩種排序的代碼一定要信手拈來才行。還有插入排序、冒泡排序、堆排序、基數排序、桶排序等。面試官對于這些排序可能會要求比較各自的優劣、各種算法的思想及其使用場景。還有要會分析算法的時間和空間復雜度。通常查找和排序算法的考察是面試的開始,如果這些問題回答不好,估計面試官都沒有繼續面試下去的興趣都沒了。所以想開個好頭就要把常見的排序算法思想及其特點要熟練掌握,有必要時要熟練寫出代碼。接下來我們就分析一下常見的排序算法及其使用場景。限于篇幅,某些算法的詳細演示和圖示請自行尋找詳細的參考。冒泡排序冒泡排序是最簡單的排序之一了,其大體思想就是通過與相鄰元素的比較和交換來把小的數交換到最前面。這個過程類似于水泡向上升一樣,因此而得名。舉個栗子,對5,3,8,6,4這個無序序列進行冒泡排序。首先從后向前冒泡,4和6比較,把4交換到前面,序列變成5,3,8,4,6。同理4和8交換,變成5,3,4,8,6,3和4無需交換。5和3交換,變成3,5,4,8,6,3.這樣一次冒泡就完了,把最小的數3排到最前面了。對剩下的序列依次冒泡就會得到一個有序序列。冒泡排序的時間復雜度為O(n^2)。實現代碼:/***@Description:冒泡排序算法實現*@author王旭*/publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){if(arr==null||arr.length==0)return;for(inti=0;i){for(intj=arr.length-1;j>i;j--){if(arr[j]]){swap(arr,j-1,j);}}}}publicstaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}選擇排序選擇排序的思想其實和冒泡排序有點類似,都是在一次排序后把最小的元素放到最前面。但是過程不同,冒泡排序是通過相鄰的比較和交換。而選擇排序是通過對整體的選擇。舉個栗子,對5,3,8,6,4這個無序序列進行簡單選擇排序,首先要選擇5以外的最小數來和5交換,也就是選擇3和5交換,一次排序后就變成了3,5,8,6,4.對剩下的序列一次進行選擇和交換,最終就會得到一個有序序列。其實選擇排序可以看成冒泡排序的優化,因為其目的相同,只是選擇排序只有在確定了最小數的前提下才進行交換,大大減少了交換的次數。選擇排序的時間復雜度為O(n^2)。實現代碼:/***@Description:簡單選擇排序算法的實現*@author王旭*/publicclassSelectSort{publicstaticvoidselectSort(int[]arr){if(arr==null||arr.length==0)return;intminIndex=0;for(inti=0;i//只需要比較n-1次minIndex=i;for(intj=i+1;j//從i+1開始比較,因為minIndex默認為i了,i就沒必要比了。if(arr[j]arr[minIndex]){minIndex=j;}}if(minIndex!=i){//如果minIndex不為i,說明找到了更小的值,交換之。swap(arr,i,minIndex);}}}publicstaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}插入排序插入排序不是通過交換位置而是通過比較找到合適的位置插入元素來達到排序的目的的。相信大家都有過打撲克牌的經歷,特別是牌數較大的。在分牌時可能要整理自己的牌,牌多的時候怎么整理呢?就是拿到一張牌,找到一個合適的位置插入。這個原理其實和插入排序是一樣的。舉個栗子,對5,3,8,6,4這個無序序列進行簡單插入排序,首先假設第一個數的位置時正確的,想一下在拿到第一張牌的時候,沒必要整理。然后3要插到5前面,把5后移一位,變成3,5,8,6,4.想一下整理牌的時候應該也是這樣吧。然后8不用動,6插在8前面,8后移一位,4插在5前面,從5開始都向后移一位。注意在插入一個數的時候要保證這個數前面的數已經有序。簡單插入排序的時間復雜度也是O(n^2)。實現代碼:/***@Description:簡單插入排序算法實現*@author王旭*/publicclassInsertSort{publicstaticvoidinsertSort(int[]arr){if(arr==null||arr.length==0)return;for(inti=1;i//假設第一個數位置時正確的;要往后移,必須要假設第一個。intj=i;inttarget=arr[i];//待插入的//后移while(j>0&target]){arr[j]=arr[j-1];j--;}//插入arr[j]=target;}}}快速排序快速排序一聽名字就覺得很高端,在實際應用當中快速排序確實也是表現最好的排序算法。快速排序雖然高端,但其實其思想是來自冒泡排序,冒泡排序是通過相鄰元素的比較和交換把最小的冒泡到最頂端,而快速排序是比較和交換小數和大數,這樣一來不僅把小數冒泡到上面同時也把大數沉到下面。舉個栗子:對5,3,8,6,4這個無序序列進行快速排序,思路是右指針找比基準數小的,左指針找比基準數大的,交換之。5,3,8,6,4用5作為比較的基準,最終會把5小的移動到5的左邊,比5大的移動到5的右邊。5,3,8,6,4首先設置i,j兩個指針分別指向兩端,j指針先掃描(思考一下為什么?)4比5小停止。然后i掃描,8比5大停止。交換i,j位置。5,3,4,6,8然后j指針再掃描,這時j掃描4時兩指針相遇。停止。然后交換4和基準數。4,3,5,6,8一次劃分后達到了左邊比5小,右邊比5大的目的。之后對左右子序列遞歸排序,最終得到有序序列。上面留下來了一個問題為什么一定要j指針先動呢?首先這也不是絕對的,這取決于基準數的位置,因為在最后兩個指針相遇的時候,要交換基準數到相遇的位置。一般選取第一個數作為基準數,那么就是在左邊,所以最后相遇的數要和基準數交換,那么相遇的數一定要比基準數小。所以j指針先移動才能先找到比基準數小的數。快速排序是不穩定的,其時間平均時間復雜度是O(nlgn)。實現代碼:/***@Description:實現快速排序算法*@author王旭*/publicclassQuickSort{//一次劃分publicstaticintpartition(int[]arr,intleft,intright){intpivotKey=arr[left];intpivotPointer=left;while(leftright){while(left=pivotKey)right--;while(leftpivotKey)left++;swap(arr,left,right);//把大的交換到右邊,把小的交換到左邊。}swap(arr,pivotPointer,left);//最后把pivot交換到中間returnleft;}publicstaticvoidquickSort(int[]arr,intleft,intright){if(left>=right)return;intpivotPos=partition(arr,left,right);quickSort(arr,left,pivotPos-1);quickSort(arr,pivotPos+1,right);}publicstaticvoidsort(int[]arr){if(arr==null||arr.length==0)return;quickSort(arr,0,arr.length-1);}publicstaticvoidswap(int[]arr,intleft,intright){inttemp=arr[left];arr[left]=arr[right];arr[right]=temp;}}其實上面的代碼還可以再優化,上面代碼中基準數已經在pivotKey中保存了,所以不需要每次交換都設置一個temp變量,在交換左右指針的時候只需要先后覆蓋就可以了。這樣既能減少空間的使用還能降低賦值運算的次數。優化代碼如下:/***@Description:實現快速排序算法*@author王旭*/publicclassQuickSort{/***劃分*@paramarr*@paramleft*@paramright*@return*/publicstaticintpartition(int[]arr,intleft,intright){intpivotKey=arr[left];while(leftright){while(left=pivotKey)right--;arr[left]=arr[right];//把小的移動到左邊while(leftpivotKey)left++;arr[right]=arr[left];//把大的移動到右邊}arr[left]=pivotKey;//最后把pivot賦值到中間returnleft;}/***遞歸劃分子序列*@paramarr*@paramleft*@paramright*/publicstaticvoidquickSort(int[]arr,intleft,intright){if(left>=right)return;intpivotPos=partition(arr,left,right);quickSort(arr,left,pivotPos-1);quickSort(arr,pivotPos+1,right);}publicstaticvoidsort(int[]arr){if(arr==null||arr.length==0)return;quickSort(arr,0,arr.length-1);}}總結快速排序的思想:冒泡+二分+遞歸分治,慢慢體會。。。堆排序堆排序是借助堆來實現的選擇排序,思想同簡單的選擇排序,以下以大頂堆為例。注意:如果想升序排序就使用大頂堆,反之使用小頂堆。原因是堆頂元素需要交換到序列尾部。首先,實現堆排序需要解決兩個問題:如何由一個無序序列鍵成一個堆?如何在輸出堆頂元素之后,調整剩余元素成為一個新的堆?第一個問題,可以直接使用線性數組來表示一個堆,由初始的無序序列建成一個堆就需要自底向上從第一個非葉元素開始挨個調整成一個堆。第二個問題,怎么調整成堆?首先是將堆頂元素和最后一個元素交換。然后比較當前堆頂元素的左右孩子節點,因為除了當前的堆頂元素,左右孩子堆均滿足條件,這時需要選擇當前堆頂元素與左右孩子節點的較大者(大頂堆)交換,直至葉子節點。我們稱這個自堆頂自葉子的調整成為篩選。從一個無序序列建堆的過程就是一個反復篩選的過程。若將此序列看成是一個完全二叉樹,則最后一個非終端節點是n/2取底個元素,由此篩選即可。舉個栗子:49,38,65,97,76,13,27,49序列的堆排序建初始堆和調整的過程如下:實現代碼:/***@Description:堆排序算法的實現,以大頂堆為例。*@author王旭*/publicclassHeapSort{/***堆篩選,除了start之外,start~end均滿足大頂堆的定義。*調整之后start~end稱為一個大頂堆。*@paramarr待調整數組*@paramstart起始指針*@paramend結束指針*/publicstaticvoidheapAdjust(int[]arr,intstart,intend){inttemp=arr[start];for(inti=2*start+1;i){//左右孩子的節點分別為2*i+1,2*i+2//選擇出左右孩子較小的下標if(i]){i++;}if(temp>=arr[i]){break;//已經為大頂堆,=保持穩定性。}arr[start]=arr[i];//將子節點上移start=i;//下一輪篩選}arr[start]=temp;//插入正確的位置}publicstaticvoidheapSort(int[]arr){if(arr==null||arr.length==0)return;//建立大頂堆for(inti=arr.length/2;i>=0;i--){heapAdjust(arr,i,arr.length-1);}for(inti=arr.length-1;i>=0;i--){swap(arr,0,i);heapAdjust(arr,0,i-1);}}publicstaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}希爾排序希爾排序是插入排序的一種高效率的實現,也叫縮小增量排序。簡單的插入排序中,如果待排序列是正序時,時間復雜度是O(n),如果序列是基本有序的,使用直接插入排序效率就非常高。希爾排序就利用了這個特點。基本思想是:先將整個待排記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄基本有序時再對全體記錄進行一次直接插入排序。舉個栗子:從上述排序過程可見,希爾排序的特點是,子序列的構成不是簡單的逐段分割,而是將某個相隔某個增量的記錄組成一個子序列。如上面的例子,第一堂排序時的增量為5,第二趟排序的增量為3。由于前兩趟的插入排序中記錄的關鍵字是和同一子序列中的前一個記錄的關鍵字進行比較,因此關鍵字較小的記錄就不是一步一步地向前挪動,而是跳躍式地往前移,從而使得進行最后一趟排序時,整個序列已經做到基本有序,只要作記錄的少量比較和移動即可。因此希爾排序的效率要比直接插入排序高。希爾排序的分析是復雜的,時間復雜度是所取增量的函數,這涉及一些數學上的難題。但是在大量實驗的基礎上推出當n在某個范圍內時,時間復雜度可以達到O(n^1.3)。實現代碼:/***@Description:希爾排序算法實現*@author王旭*/publicclassShellSort{/***希爾排序的一趟插入*@paramarr待排數組*@paramd增量*/publicstaticvoidshellInsert(int[]arr,intd){for(inti=d;i){intj=i-d;inttemp=arr[i];//記錄要插入的數據while(j>=0&arr[j]>temp){//從后向前,找到比其小的數的位置arr[j+d]=arr[j];//向后挪動j-=d;}if(j!=i-d)//存在比其小的數arr[j+d]=temp;}}publicstaticvoidshellSort(int[]arr){if(arr==null||arr.length==0)return;intd=arr.length/2;while(d>=1){shellInsert(arr,d);d/=2;}}}歸并排序歸并排序是另一種不同的排序方法,因為歸并排序使用了遞歸分治的思想,所以理解起來比較容易。其基本思想是,先遞歸劃分子問題,然后合并結果。把待排序列看成由兩個有序的子序列,然后合并兩個子序列,然后把子序列看成由兩個有序序列。。。。。倒著來看,其實就是先兩兩合并,然后四四合并。。。最終形成有序序列。空間復雜度為O(n),時間復雜度為O(nlogn)。舉個栗子:實現代碼:/***@Description:歸并排序算法的實現*@author王旭*/publicclassMergeSort{publicstaticvoidmergeSort(int[]arr){mSort(arr,0,arr.length-1);}/***遞歸分治*@paramarr待排數組*@paramleft左指針*@paramright右指針*/publicstaticvoidmSort(int[]arr,intleft,intright){if(left>=right)return;intmid=(left+right)/2;mSort(arr,left,mid);//遞歸排序左邊mSort(arr,mid+1,right);//遞歸排序右邊merge(arr,left,mid,right);//合并}/***合并兩個有序數組*@paramarr待合并數組*@paramleft左指針*@parammid中間指針*@paramright右指針*/publicstaticvoidmerge(int[]arr,intleft,intmid,intright){//[left,mid][mid+1,right]int[]temp=newint[right-left+1];//中間數組inti=left;intj=mid+1;intk=0;while(iright){if(arr[i]arr[j]){temp[k++]=arr[i++];}else{temp[k++]=arr[j++];}}while(imid){temp[k++]=arr[i++];}while(jright){temp[k++]=arr[j++];}for(intp=0;p){arr[left+p]=temp[p];}}}計數排序如果在面試中有面試官要求你寫一個O(n)時間復雜度的排序算法,你千萬不要立刻說:這不可能!雖然前面基于比較的排序的下限是O(nlogn)。但是確實也有線性時間復雜度的排序,只不過有前提條件,就是待排序的數要滿足一定的范圍的整數,而且計數排序需要比較多的輔助空間。其基本思想是,用待排序的數作為計數數組的下標,統計每個數字的個數。然后依次輸出即可得到有序序列。實現代碼:/***@Description:計數排序算法實現*@author王旭*/publicclassCountSort{publicstaticvoidcountSort(int[]arr){if(arr==null||arr.length==0)return;intmax=max(arr);int[]count=newint[max+1];Arrays.fill(count,0);for(inti=0;i){count[arr[i]]++;}intk=0;for(inti=0;i){for(intj=0;j){arr[k++]=i;}}}publicstaticintmax(int[]arr){intmax=Integer.MIN_VALUE;for(intele:rr){if(ele>max)max=ele;}returnmax;}}桶排序桶排序算是計數排序的一種改進和推廣,但是網上有許多資料把計數排序和桶排序混為一談。其實桶排序要比計數排序復雜許多。桶排序的基本思想:假設有一組長度為N的待排關鍵字序列K[1….n]。首先將這個序列劃分成M個的子區間(桶)。然后基于某種映射函數,將待排序列的關鍵字k映射到第i個桶中(即桶數組B的下標i),那么該關鍵字k就作為B[i]中的元素(每個桶B[i]都是一組大小為N/M的序列)。接著對每個桶B[i]中的所有元素進行比較排序(可以使用快排)。然后依次枚舉輸出B[0]….B[M]中的全部內容即是一個有序序列。bindex=f(key)其中,bindex為桶數組B的下標(即第bindex個桶),k為待排序列的關鍵字。桶排序之所以能夠高效,其關鍵在于這個映射函數,它必須做到:如果關鍵字k1舉個栗子:假如待排序列K={49、38、35、97、76、73、27、49}。這些數據全部在1—100之間。因此我們定制10個桶,然后確定映射函數f(k)=k/10。則第一個關鍵字49將定位到第4個桶中(49/10=4)。依次將所有關鍵字全部堆入桶中,并在每個非空的桶中進行快速排序后得到如圖所示。只要順序輸出每個B[i]中的數據就可以得到有序序列了。桶排序分析:桶排序利用函數的映射關系,減少了幾乎所有的比較工作。實際上,桶排序的f(k)值的計算,其作用就相當于快排中劃分,希爾排序中的子序列,歸并排序中的子問題,已經把大量數據分割成了基本有序的數據塊(桶)。然后只需要對桶中的少量數據做先進的比較排序即可。對N個關鍵字進行桶排序的時間復雜度分為兩個部分:(1)循環計算每個關鍵字的桶映射函數,這個時間復雜度是O(N)。(2)利用先進的比較排序算法對每個桶內的所有數據進行排序,其時間復雜度為∑O(Ni*logNi)。其中Ni為第i個桶的數據量。很顯然,第(2)部分是桶排序性能好壞的決定因素。盡量減少桶內數據的數量是提高效率的唯一辦法(因為基于比較排序的最好平均時間復雜度只能達到O(N*logN)了)。因此,我們需要盡量做到下面兩點:(1)映射函數f(k)能夠將N個數據平均的分配到M個桶中,這樣每個桶就有[N/M]個數據量。(2)盡量的增大桶的數量。極限情況下每個桶只能得到一個數據,這樣就完全避開了桶內數據的“比較”排序操作。當然,做到這一點很不容易,數據量巨大的情況下,f(k)函數會使得桶集合的數量巨大,空間浪費嚴重。這就是一個時間代價和空間代價的權衡問題了。對于N個待排數據,M個桶,平均每個桶[N/M]個數據的桶排序平均時間復雜度為:O(N)+O(M(N/M)log(N/M))=O(N+N(logN-logM))=O(N+NlogN-N*logM)當N=M時,即極限情況下每個桶只有一個數據時。桶排序的最好效率能夠達到O(N)。總結:桶排序的平均時間復雜度為線性的O(N+C),其中C=N*(logN-logM)。如果相對于同樣的N,桶數量M越大,其效率越高,最好的時間復雜度達到O(N)。當然桶排序的空間復雜度為O(N+M),如果輸入數據非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。實現代碼:/***@Description:桶排序算法實現*@author王旭*/publicclassBucketSort{publicstaticvoidbucketSort(int[]arr){if(arr==null&arr.length==0)return;intbucketNums=10;//這里默認為10,規定待排數[0,100)List>buckets=newArrayList>();//桶的索引for(inti=0;i){buckets.add(newLinkedList());//用鏈表比較合適}//劃分桶for(inti=0;i){buckets.get(f(arr[i])).add(arr[i]);}//對每個桶進行排序for(inti=0;i){if(!buckets.get(i).isEmpty()){Collections.sort(buckets.get(i));//對每個桶進行快排}}//還原排好序的數組intk=0;for(Listbucket:buckets){for(intele:bucket){arr[k++]=ele;}}}/***映射函數*@paramx*@return*/publicstaticintf(intx){returnx/10;}}基數排序基數排序又是一種和前面排序方式不同的排序方式,基數排序不需要進行記錄關鍵字之間的比較。基數排序是一種借助多關鍵字排序思想對單邏輯關鍵字進行排序的方法。所謂的多關鍵字排序就是有多個優先級不同的關鍵字。比如說成績的排序,如果兩個人總分相同,則語文高的排在前面,語文成績也相同則數學高的排在前面。。。如果對數字進行排序,那么個位、十位、百位就是不同優先級的關鍵字,如果要進行升序排序,那么個位、十位、百位優先級一次增加。基數排序是通過多次的收分配和收集來實現的,關鍵字優先級低的先進行分配和收集。舉個栗子:實現代碼:/***@Description:基數排序算法實現*@author王旭*/publicclassRadixSort{publicstaticvoidradixSort(int[]arr){if(arr==null&arr.length==0)return;intmaxBit=getMaxBit(arr);for(inti=1;i){List>buf=distribute(arr,i);//分配collecte(arr,buf);//收集}}/***分配*@paramarr待分配數組*@paramiBit要分配第幾位*@return*/publicstaticList>distribute(int[]arr,intiBit){List>buf=newArrayList>();for(intj=0;j){buf.add(newLinkedList());}for(inti=0;i){buf.ge
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級品德與生活上冊 可愛的生命 1教學設計 鄂教版
- 2024四川宜賓南溪公用服務集團有限責任公司招聘15人筆試參考題庫附帶答案詳解
- 二十年后的學校(教學設計)-2023-2024學年人教版(2012)美術六年級下冊
- 創傷外科護理基本常識
- 九年級道德與法治上冊 第一單元 五星紅旗為你驕傲 第1課 統一的多民族國家 第2框 我的中國心教學設計 魯人版六三制
- 冀教版八年級下冊Lesson 40 Body Language教案
- 人教部編版第16課 早期殖民掠奪教學設計
- 人教新目標 (Go for it) 版七年級上冊Unit 3 What color is it 教案配套
- 成品油檢定培訓
- 2024中電信翼康科技有限公司招聘15人筆試參考題庫附帶答案詳解
- 全大學進階英語綜合教程2綜合訓練第一單元(含答案)
- 全旅館業前臺從業人員資格證考試答案解析
- 廣東省護士延續注冊健康體檢表
- 專業工程分包業主審批表
- 活動物料清單
- 精細化工產品公司企業經營戰略方案
- 缺血缺氧性腦病詳解課件
- 自動打鈴控制器plc課程設計
- 冠狀動脈CT解剖詳解
- 地下連續墻鋼筋籠起重吊裝專項施工方案
- 單值和移動極差X-MR控制圖
評論
0/150
提交評論