選擇排序java,選擇排序JAVA

本文目錄一覽:

java 選擇排序法

你好,很小的錯誤,看下注釋的地方

public class Outfile {

public static void main(String[] args) {

int a[] = { 20, 29, 21, 45, 68, 15, 3, 5 };

for (int i = 0; i a.length – 1; i++) {

int min = i;

for (int j = i + 1; j a.length; j++) {

if (a[j] a[min]) {

min = j;

}

}

if (min != i) {//這一段從上面內層的for拿了出來

int b = a[min];

a[min] = a[i];

a[i] = b;

}

}

for (int c = 0; c a.length; c++) {

System.out.println(a[c]);

}

}

}

運行結果:

3

5

15

20

21

29

45

68

java怎麼讓數組的數字從大到小排序?

將數字從大到小排序的方法:

例如簡一點的冒泡排序,將第一個數字和後面的數字逐個比較大小,如果小於,則互換位置,大於則不動。此時,第一個數為數組中的最大數。然後再將第二個數與後面的數逐個比較,以次類推。

示例代碼如下: 

public class Test { 

public static void main(String[] args) { 

int [] array = {12,3,1254,235,435,236,25,34,23}; 

int temp; 

for (int i = 0; i  array.length; i++) { 

for (int j = i+1; j  array.length; j++) { 

if (array[i]  array[j]) { 

temp = array[i]; 

array[i] = array[j]; 

array[j] = temp; // 兩個數交換位置 

for (int i = 0; i  array.length; i++) { 

System.out.print(array[i]+”  “); 

}

數組對於每一門編程語言來說都是重要的數據結構之一,當然不同語言對數組的實現及處理也不盡相同。

Java 語言中提供的數組是用來存儲固定大小的同類型元素。

你可以聲明一個數組變量,如 numbers[100] 來代替直接聲明 100 個獨立變量 number0,number1,….,number99

擴展資料

Java中利用數組進行數字排序一般有4種方法:

1、選擇排序是先將數組中的第一個數作為最大或最小數,然後通過循環比較交換最大數或最小數與一輪比較中第一個數位置進行排序。

2、冒泡排序也是先將數組中的第一個數作為最大或最小數,循環比較相鄰兩個數的大小,滿足條件就互換位置,將最大數或最小數沉底。

3、快速排序法主要是運用Arrays類中的Arrays.sort方法()實現。

4、插入排序是選擇一個數組中的數據,通過不斷的插入比較最後進行排序。

Java的排序算法有哪些

java的排序大的分類可以分為兩種:內排序和外排序。在排序過程中,全部記錄存放在內存,則稱為內排序,如果排序過程中需要使用外存,則稱為外排序。下面講的排序都是屬於內排序。

1.插入排序:直接插入排序、二分法插入排序、希爾排序。

2.選擇排序:簡單選擇排序、堆排序。

3.交換排序:冒泡排序、快速排序。

4.歸併排序

5.基數排序

數據結構 java開發中常用的排序算法有哪些

排序算法有很多,所以在特定情景中使用哪一種算法很重要。為了選擇合適的算法,可以按照建議的順序考慮以下標準:

(1)執行時間

(2)存儲空間

(3)編程工作

對於數據量較小的情形,(1)(2)差別不大,主要考慮(3);而對於數據量大的,(1)為首要。

主要排序法有:

一、冒泡(Bubble)排序——相鄰交換

二、選擇排序——每次最小/大排在相應的位置

三、插入排序——將下一個插入已排好的序列中

四、殼(Shell)排序——縮小增量

五、歸併排序

六、快速排序

七、堆排序

八、拓撲排序

一、冒泡(Bubble)排序

———————————-Code 從小到大排序n個數————————————

void BubbleSortArray()

{

for(int i=1;in;i++)

{

for(int j=0;in-i;j++)

{

if(a[j]a[j+1])//比較交換相鄰元素

{

int temp;

temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;

}

}

}

}

————————————————-Code————————————————

效率 O(n²),適用於排序小列表。

二、選擇排序

———————————-Code 從小到大排序n個數——————————–

void SelectSortArray()

{

int min_index;

for(int i=0;in-1;i++)

{

min_index=i;

for(int j=i+1;jn;j++)//每次掃描選擇最小項

if(arr[j]arr[min_index]) min_index=j;

if(min_index!=i)//找到最小項交換,即將這一項移到列表中的正確位置

{

int temp;

temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;

}

}

}

————————————————-Code—————————————–

效率O(n²),適用於排序小的列表。

三、插入排序

——————————————–Code 從小到大排序n個數————————————-

void InsertSortArray()

{

for(int i=1;in;i++)//循環從第二個數組元素開始,因為arr[0]作為最初已排序部分

{

int temp=arr[i];//temp標記為未排序第一個元素

int j=i-1;

while (j=0 arr[j]temp)/*將temp與已排序元素從小到大比較,尋找temp應插入的位置*/

{

arr[j+1]=arr[j];

j–;

}

arr[j+1]=temp;

}

}

——————————Code————————————————————–

最佳效率O(n);最糟效率O(n²)與冒泡、選擇相同,適用於排序小列表

若列表基本有序,則插入排序比冒泡、選擇更有效率。

四、殼(Shell)排序——縮小增量排序

————————————-Code 從小到大排序n個數————————————-

void ShellSortArray()

{

for(int incr=3;incr0;incr–)//增量遞減,以增量3,2,1為例

{

for(int L=0;L(n-1)/incr;L++)//重複分成的每個子列表

{

for(int i=L+incr;in;i+=incr)//對每個子列表應用插入排序

{

int temp=arr[i];

int j=i-incr;

while(j=0arr[j]temp)

{

arr[j+incr]=arr[j];

j-=incr;

}

arr[j+incr]=temp;

}

}

}

}

————————————–Code——————————————-

適用於排序小列表。

效率估計O(nlog2^n)~O(n^1.5),取決於增量值的最初大小。建議使用質數作為增量值,因為如果增量值是2的冪,則在下一個通道中會再次比較相同的元素。

殼(Shell)排序改進了插入排序,減少了比較的次數。是不穩定的排序,因為排序過程中元素可能會前後跳躍。

五、歸併排序

———————————————-Code 從小到大排序—————————————

void MergeSort(int low,int high)

{

if(low=high) return;//每個子列表中剩下一個元素時停止

else int mid=(low+high)/2;/*將列表劃分成相等的兩個子列表,若有奇數個元素,則在左邊子列表大於右側子列表*/

MergeSort(low,mid);//子列表進一步劃分

MergeSort(mid+1,high);

int [] B=new int [high-low+1];//新建一個數組,用於存放歸併的元素

for(int i=low,j=mid+1,k=low;i=mid j=high;k++)/*兩個子列表進行排序歸併,直到兩個子列表中的一個結束*/

{

if (arr[i]=arr[j];)

{

B[k]=arr[i];

I++;

}

else

{ B[k]=arr[j]; j++; }

}

for( ;j=high;j++,k++)//如果第二個子列表中仍然有元素,則追加到新列表

B[k]=arr[j];

for( ;i=mid;i++,k++)//如果在第一個子列表中仍然有元素,則追加到新列表中

B[k]=arr[i];

for(int z=0;zhigh-low+1;z++)//將排序的數組B的 所有元素複製到原始數組arr中

arr[z]=B[z];

}

—————————————————–Code—————————————————

效率O(nlogn),歸併的最佳、平均和最糟用例效率之間沒有差異。

適用於排序大列表,基於分治法。

六、快速排序

————————————Code——————————————–

/*快速排序的算法思想:選定一個樞紐元素,對待排序序列進行分割,分割之後的序列一個部分小於樞紐元素,一個部分大於樞紐元素,再對這兩個分割好的子序列進行上述的過程。*/ void swap(int a,int b){int t;t =a ;a =b ;b =t ;}

int Partition(int [] arr,int low,int high)

{

int pivot=arr[low];//採用子序列的第一個元素作為樞紐元素

while (low high)

{

//從後往前栽後半部分中尋找第一個小於樞紐元素的元素

while (low high arr[high] = pivot)

{

–high;

}

//將這個比樞紐元素小的元素交換到前半部分

swap(arr[low], arr[high]);

//從前往後在前半部分中尋找第一個大於樞紐元素的元素

while (low high arr [low ]=pivot )

{

++low ;

}

swap (arr [low ],arr [high ]);//將這個樞紐元素大的元素交換到後半部分

}

return low ;//返回樞紐元素所在的位置

}

void QuickSort(int [] a,int low,int high)

{

if (low high )

{

int n=Partition (a ,low ,high );

QuickSort (a ,low ,n );

QuickSort (a ,n +1,high );

}

}

—————————————-Code————————————-

平均效率O(nlogn),適用於排序大列表。

此算法的總時間取決於樞紐值的位置;選擇第一個元素作為樞紐,可能導致O(n²)的最糟用例效率。若數基本有序,效率反而最差。選項中間值作為樞紐,效率是O(nlogn)。

基於分治法。

七、堆排序

最大堆:後者任一非終端節點的關鍵字均大於或等於它的左、右孩子的關鍵字,此時位於堆頂的節點的關鍵字是整個序列中最大的。

思想:

(1)令i=l,並令temp= kl ;

(2)計算i的左孩子j=2i+1;

(3)若j=n-1,則轉(4),否則轉(6);

(4)比較kj和kj+1,若kj+1kj,則令j=j+1,否則j不變;

(5)比較temp和kj,若kjtemp,則令ki等於kj,並令i=j,j=2i+1,並轉(3),否則轉(6)

(6)令ki等於temp,結束。

—————————————–Code—————————

void HeapSort(SeqIAst R)

{ //對R[1..n]進行堆排序,不妨用R[0]做暫存單元 int I; BuildHeap(R); //將R[1-n]建成初始堆for(i=n;i1;i–) //對當前無序區R[1..i]進行堆排序,共做n-1趟。{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //將堆頂和堆中最後一個記錄交換 Heapify(R,1,i-1); //將R[1..i-1]重新調整為堆,僅有R[1]可能違反堆性質 } } —————————————Code————————————–

堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過調用Heapify實現的。

堆排序的最壞時間複雜度為O(nlgn)。堆排序的平均性能較接近於最壞性能。 由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的文件。 堆排序是就地排序,輔助空間為O(1), 它是不穩定的排序方法。

堆排序與直接插入排序的區別:

直接選擇排序中,為了從R[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在R[2..n]中選出關鍵字最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留這些比較結果,所以後一趟排序時又重複執行了這些比較操作。

堆排序可通過樹形結構保存部分比較結果,可減少比較次數。

八、拓撲排序

例 :學生選修課排課先後順序

拓撲排序:把有向圖中各頂點按照它們相互之間的優先關係排列成一個線性序列的過程。

方法:

在有向圖中選一個沒有前驅的頂點且輸出

從圖中刪除該頂點和所有以它為尾的弧

重複上述兩步,直至全部頂點均已輸出(拓撲排序成功),或者當圖中不存在無前驅的頂點(圖中有迴路)為止。

—————————————Code————————————–

void TopologicalSort()/*輸出拓撲排序函數。若G無迴路,則輸出G的頂點的一個拓撲序列並返回OK,否則返回ERROR*/

{

int indegree[M];

int i,k,j;

char n;

int count=0;

Stack thestack;

FindInDegree(G,indegree);//對各頂點求入度indegree[0….num]

InitStack(thestack);//初始化棧

for(i=0;iG.num;i++)

Console.WriteLine(“結點”+G.vertices[i].data+”的入度為”+indegree[i]);

for(i=0;iG.num;i++)

{

if(indegree[i]==0)

Push(thestack.vertices[i]);

}

Console.Write(“拓撲排序輸出順序為:”);

while(thestack.Peek()!=null)

{

Pop(thestack.Peek());

j=locatevex(G,n);

if (j==-2)

{

Console.WriteLine(“發生錯誤,程序結束。”);

exit();

}

Console.Write(G.vertices[j].data);

count++;

for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)

{

k=p.adjvex;

if (!(–indegree[k]))

Push(G.vertices[k]);

}

}

if (countG.num)

Cosole.WriteLine(“該圖有環,出現錯誤,無法排序。”);

else

Console.WriteLine(“排序成功。”);

}

—————————————-Code————————————–

算法的時間複雜度O(n+e)。

java中排序方法有哪些

1、直接插入排序:最基本的插入排序,將第i個插入到前i-1個中的適當位置。

2、折半插入排序:因為是已經確定了前部分是有序序列,所以在查找插入位置的時候可以用折半查找的方法進行查找,提高效率。

3、 希爾排序: 又稱縮小增量排序法。把待排序序列分成若干較小的子序列,然後逐個使用直接插入排序法排序,最後再對一個較為有序的序列進行一次排序,主要是為了減少移動的次數,提高效率。原理應該就是從無序到漸漸有序,要比直接從無序到有序移動的次數會少一些。

4、 冒泡排序:反覆掃描待排序序列,在掃描的過程中順次比較相鄰的兩個元素的大小,若逆序就交換位置。第一趟,從第一個數據開始,比較相鄰的兩個數據,(以升序為例)如果大就交換,得到一個最大數據在末尾;然後進行第二趟,只掃描前n-1個元素,得到次大的放在倒數第二位。以此類推,最後得到升序序列。如果在掃描過程中,發現沒有交換,說明已經排好序列,直接終止掃描。所以最多進行n-1趟掃描。

5、快速排序: 思想:冒泡排序一次只能消除一個逆序,為了能一次消除多個逆序,採用快速排序。以一個關鍵字為軸,從左從右依次與其進行對比,然後交換,第一趟結束後,可以把序列分為兩個子序列,然後再分段進行快速排序,達到高效。

此外還有選擇、歸併、分配排序等等及它們的子類排序

原創文章,作者:YQWO,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/148408.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YQWO的頭像YQWO
上一篇 2024-11-03 15:15
下一篇 2024-11-03 15:16

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論