日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java常见排序算法之直接选择排序

發(fā)布時(shí)間:2023/12/18 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java常见排序算法之直接选择排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在學(xué)習(xí)算法的過程中,我們難免會(huì)接觸很多和排序相關(guān)的算法??偠灾?#xff0c;對(duì)于任何編程人員來說,基本的排序算法是必須要掌握的。

從今天開始,我們將要進(jìn)行基本的排序算法的講解。Are you ready?Let‘s go~~~

1、排序算法的基本概念的講解

???? 時(shí)間復(fù)雜度:需要排序的的關(guān)鍵字的比較次數(shù)和相應(yīng)的移動(dòng)的次數(shù)。

???? 空間復(fù)雜度:分析需要多少輔助的內(nèi)存。

???? 穩(wěn)定性:如果記錄兩個(gè)關(guān)鍵字的A和B它們的值相等,經(jīng)過排序后它們的位置沒有發(fā)生交換,那么我們稱這個(gè)排序算法是穩(wěn)定的。

????????????? 否則我們稱這個(gè)排序算法是不穩(wěn)定的。

???

??? 排序算法的常見分類:

??? 1、內(nèi)部排序(最常見的一種排序方式,不需要借助第三方輔助存儲(chǔ)工具)

??? 2、外部排序(需要借助外部存儲(chǔ)來輔助完成相關(guān)的排序操作)

??????? 如果參與排序的數(shù)據(jù)元素非常的多,數(shù)據(jù)量非常的大,計(jì)算機(jī)無法把整個(gè)排序過程放到內(nèi)存中進(jìn)行的話,

??????? 我們必須借助外部存儲(chǔ)器如磁盤來完成,這種排序方式,我們稱之為外部排序。

??????? 其中外部排序最常見的就是多路歸并排序,即將原始文件分解成多個(gè)能夠一次性裝入內(nèi)存的部分,分別把每一部分調(diào)入

??????? 內(nèi)存完成相應(yīng)的排序,接下來在對(duì)多個(gè)有序的外部文件進(jìn)行多路歸并排序。

??

?? 對(duì)于我們絕大多數(shù)的程序員而言,我們經(jīng)常遇到的為內(nèi)部排序。接下來我們將要對(duì)常見的內(nèi)部排序進(jìn)行相應(yīng)的講解。

??? 今天要講解的內(nèi)部排序?yàn)?

???直接選擇排序

?? 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次,得到一個(gè)按排序碼從小到大排列的有序序列·

???? 例如:

初始狀態(tài) [ 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代碼實(shí)

使用Java代碼實(shí)現(xiàn)相關(guān)的內(nèi)容

?

package com.yonyou.test;/*** 內(nèi)部排序算法之直接選擇排序* 默認(rèn)按照從小到大進(jìn)行排序操作* @author 小浩* @創(chuàng)建日期 2015-3-24*/ public class Test{public static void main(String[] args) {//需要進(jìn)行排序的數(shù)組int[] array=new int[]{8,3,2,1,7,4,6,5};//輸出原數(shù)組的內(nèi)容printResult(array);//進(jìn)行直接選擇排序操作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); }}//輸出排序后的相關(guān)結(jié)果printResult(array);}/*** 輸出相應(yīng)數(shù)組的結(jié)果* @param array*/private static void printResult(int[] array) {for(int value:array) System.out.print(" "+value+" ");System.out.println();}/*** 交換數(shù)組中兩個(gè)變量的值* @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;} }

?

?上面的直接選擇排序的存在一定的效率問題,不知道你是否發(fā)現(xiàn)了。對(duì)于每次選擇的時(shí)候,一旦發(fā)現(xiàn)當(dāng)前數(shù)比被比較的數(shù)小,立刻交換它們的

?值,其實(shí)沒有必要這樣做的。因?yàn)槲覀兛梢韵葧捍嬉幌陆Y(jié)果,當(dāng)所有的循環(huán)都執(zhí)行完畢的時(shí)候,我們?cè)谶M(jìn)行交換處理也不遲。而且這樣可以有

?效的提高效率。具體的請(qǐng)看代碼:

?

package com.yonyou.test;/*** 內(nèi)部排序算法之直接選擇排序* 默認(rèn)按照從小到大進(jìn)行排序操作* @author 小浩* @創(chuàng)建日期 2015-3-24*/ public class Test{public static void main(String[] args) {//需要進(jìn)行排序的數(shù)組int[] array=new int[]{8,3,2,1,7,4,6,5};//輸出原數(shù)組的內(nèi)容printResult(array);//進(jìn)行直接選擇排序操作for(int i=0;i<array.length-1;i++){//用于暫存當(dāng)前變量的最小的值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); }//輸出排序后的相關(guān)結(jié)果printResult(array);}/*** 輸出相應(yīng)數(shù)組的結(jié)果* @param array*/private static void printResult(int[] array) {for(int value:array) System.out.print(" "+value+" ");System.out.println();}/*** 交換數(shù)組中兩個(gè)變量的值* @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.直接選擇排序的效率分析

??? 時(shí)間復(fù)雜度:假設(shè)有n個(gè)數(shù)據(jù),數(shù)據(jù)交換的次數(shù)最多為n-1次,但程序的總體的比較次數(shù)較多。所以綜合考慮有直接選擇排序的時(shí)間復(fù)雜度為O(n2)

?? (n的平方)。所以當(dāng)記錄占用字節(jié)數(shù)較多時(shí),通常比直接插入排序的執(zhí)行速度快些。

??? 空間復(fù)雜度:直接選擇排序的空間復(fù)雜度很好,它只需要一個(gè)附加單元用于數(shù)據(jù)交換,所以其空間復(fù)雜度為O(1)。

??? 穩(wěn)定性:由于在直接選擇排序中存在著不相鄰元素之間的互換,因此,直接選擇排序是一種不穩(wěn)定的排序方法。

?

?? 好吧,直接選擇排序的講解就先到這里了。

?

?

?

?

?

??????

??

?

?

?

???

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiohao/p/4362887.html

總結(jié)

以上是生活随笔為你收集整理的Java常见排序算法之直接选择排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。