Java常见排序算法之直接选择排序
在學習算法的過程中,我們難免會接觸很多和排序相關的算法??偠灾?#xff0c;對于任何編程人員來說,基本的排序算法是必須要掌握的。
從今天開始,我們將要進行基本的排序算法的講解。Are you ready?Let‘s go~~~
1、排序算法的基本概念的講解
???? 時間復雜度:需要排序的的關鍵字的比較次數和相應的移動的次數。
???? 空間復雜度:分析需要多少輔助的內存。
???? 穩定性:如果記錄兩個關鍵字的A和B它們的值相等,經過排序后它們的位置沒有發生交換,那么我們稱這個排序算法是穩定的。
????????????? 否則我們稱這個排序算法是不穩定的。
???
??? 排序算法的常見分類:
??? 1、內部排序(最常見的一種排序方式,不需要借助第三方輔助存儲工具)
??? 2、外部排序(需要借助外部存儲來輔助完成相關的排序操作)
??????? 如果參與排序的數據元素非常的多,數據量非常的大,計算機無法把整個排序過程放到內存中進行的話,
??????? 我們必須借助外部存儲器如磁盤來完成,這種排序方式,我們稱之為外部排序。
??????? 其中外部排序最常見的就是多路歸并排序,即將原始文件分解成多個能夠一次性裝入內存的部分,分別把每一部分調入
??????? 內存完成相應的排序,接下來在對多個有序的外部文件進行多路歸并排序。
??
?? 對于我們絕大多數的程序員而言,我們經常遇到的為內部排序。接下來我們將要對常見的內部排序進行相應的講解。
??? 今天要講解的內部排序為:
???直接選擇排序
?? 1.基本概念
???? 所謂直接選擇排序:就是第一次從R[0]~R[n-1]中選取最小值,與R[0]交換,第二次從R[1]~R[n-1]中選取最小值,與R[1]交換,....,第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列·
???? 例如:
初始狀態 [ 8 3 2 1 7 4 6 5 ]???8 -- 1 第一次 [ 1 3 2 8 7 4 6 5 ]??????3 -- 2 第二次? [ 1 2 3 8 7 4 6 5 ]???? 3 -- 3 第三次? [ 1 2 3 8 7 4 6 5 ]???? 8 -- 4 第四次? [ 1 2 3 4 7 8 6 5 ]???? 7 -- 5 第五次? [ 1 2 3 4 5 8 6 7 ]???? 8 -- 6 第六次? [ 1 2 3 4 5 6 8 7 ]???? 8 -- 7 第七次? [ 1 2 3 4 5 6 7 8 ]??? 排序完成?
2.Java代碼實
使用Java代碼實現相關的內容
?
package com.yonyou.test;/*** 內部排序算法之直接選擇排序* 默認按照從小到大進行排序操作* @author 小浩* @創建日期 2015-3-24*/ public class Test{public static void main(String[] args) {//需要進行排序的數組int[] array=new int[]{8,3,2,1,7,4,6,5};//輸出原數組的內容printResult(array);//進行直接選擇排序操作for(int i=0;i<array.length-1;i++){for(int j=i+1;j<array.length;j++){if(array[i]>array[j])swap(array,i,j); }}//輸出排序后的相關結果printResult(array);}/*** 輸出相應數組的結果* @param array*/private static void printResult(int[] array) {for(int value:array) System.out.print(" "+value+" ");System.out.println();}/*** 交換數組中兩個變量的值* @param array* @param i* @param j*/private static void swap(int[] array,int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;} }?
?上面的直接選擇排序的存在一定的效率問題,不知道你是否發現了。對于每次選擇的時候,一旦發現當前數比被比較的數小,立刻交換它們的
?值,其實沒有必要這樣做的。因為我們可以先暫存一下結果,當所有的循環都執行完畢的時候,我們在進行交換處理也不遲。而且這樣可以有
?效的提高效率。具體的請看代碼:
?
package com.yonyou.test;/*** 內部排序算法之直接選擇排序* 默認按照從小到大進行排序操作* @author 小浩* @創建日期 2015-3-24*/ public class Test{public static void main(String[] args) {//需要進行排序的數組int[] array=new int[]{8,3,2,1,7,4,6,5};//輸出原數組的內容printResult(array);//進行直接選擇排序操作for(int i=0;i<array.length-1;i++){//用于暫存當前變量的最小的值int temp=i;for(int j=i+1;j<array.length;j++){if(array[temp]>array[j])temp=j;}if(temp!=i)swap(array,i,temp); }//輸出排序后的相關結果printResult(array);}/*** 輸出相應數組的結果* @param array*/private static void printResult(int[] array) {for(int value:array) System.out.print(" "+value+" ");System.out.println();}/*** 交換數組中兩個變量的值* @param array* @param i* @param j*/private static void swap(int[] array,int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;} }?
3.直接選擇排序的效率分析
??? 時間復雜度:假設有n個數據,數據交換的次數最多為n-1次,但程序的總體的比較次數較多。所以綜合考慮有直接選擇排序的時間復雜度為O(n2)
?? (n的平方)。所以當記錄占用字節數較多時,通常比直接插入排序的執行速度快些。
??? 空間復雜度:直接選擇排序的空間復雜度很好,它只需要一個附加單元用于數據交換,所以其空間復雜度為O(1)。
??? 穩定性:由于在直接選擇排序中存在著不相鄰元素之間的互換,因此,直接選擇排序是一種不穩定的排序方法。
?
?? 好吧,直接選擇排序的講解就先到這里了。
?
?
?
?
?
??????
??
?
?
?
???
?
轉載于:https://www.cnblogs.com/xiohao/p/4362887.html
總結
以上是生活随笔為你收集整理的Java常见排序算法之直接选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 2018牛客网暑期ACM多校训练营(第十
- 下一篇: 用上Linux后收集变得山穷水尽
