亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

java語言

JAVA語言的常見排序算法

時間:2024-07-16 03:54:09 java語言 我要投稿
  • 相關(guān)推薦

JAVA語言的常見排序算法

  導(dǎo)語:每種排序算法都有它自己的優(yōu)點(diǎn)及局限性,適用于不同的要求范圍,在選擇時應(yīng)根據(jù)需要適當(dāng)選用,甚至可將多種算法結(jié)合起來使用,效率才會更高。下面就由小編為大家介紹一下JAVA語言的常見排序算法,歡迎大家閱讀!

  1 排序算法概述

  計算機(jī)中的排序,就是使一串記錄,按照其中的某個或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作。而排序算法則是一種能將一串?dāng)?shù)據(jù)依照特定的方式進(jìn)行排序的一種算法。

  根據(jù)排序過程中涉及的存儲器不同,可以將排序方法分為兩大類: 一類是內(nèi)部排序,指的是待排序地記錄存放在計算機(jī)隨機(jī)存儲器中進(jìn)行的排序過程。另一類是外部排序,指的是需要對外存儲器進(jìn)行訪問的排序過程。該課題主要研究幾類常見的內(nèi)部排序,有冒泡排序、插入排序、選擇排序、歸并排序。

  2 常見排序算法基本思想和JAVA代碼實(shí)現(xiàn)

  2.1 冒泡排序

  2.1.1 基本思想

  冒泡排序是將相鄰的兩個記錄按關(guān)鍵值兩兩比較,如果記錄的次序相反時即進(jìn)行交換,直到序列中不存在反序的記錄為止。如有n個無序數(shù),第一趟將第一個和第二個進(jìn)行比較,將大的放在第二個位置,再將第二個和第三比較,大的放在第三個位置,依次向后比較,比較n-1次,將最大的放在最后(n的位置);第二趟,再從第一個開始比較,比較n-2次,這次把最大的放到第n-1個位置,然后再來回比較。遵循第i次遍歷就從第一個數(shù)開始比較n-i次,將最后的值放在第n-i+1的位置。如圖1、圖2所示。

  2.1.2 JAVA語言實(shí)現(xiàn)冒泡排序核心代碼

  //冒泡排序:10萬個隨機(jī)數(shù)用時約25秒

  public static voidbubblesort (int a[]){

  inti,j,temp;

  int n=a。length; //獲得數(shù)組長度

  for(i=1;i<=n;i++){ //外層循環(huán)控制比較趟數(shù)

  for( j=0;j  if(a[j]>a[j+1]){//如果相鄰兩數(shù)前者比后者大,那交換

  temp=a[j];

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

  a[j+1]=temp;

  }

  }

  }

  }

  2.2 插入排序

  2.2.1 基本思想

  插入排序是一種簡單的排序方法,它的基本排序思想是依次將待排序的記錄逐一地按其關(guān)鍵字值的大小插入到一個已排好序的有序序列中,得到一個新的有序序列,直到所有的記錄插完為止,從而實(shí)現(xiàn)排序。在有序情況下只需要經(jīng)過n-1次比較,在最壞情況下,將需要n(n-1)/2次比較,如圖3所示。

  2.2.2 JAVA語言實(shí)現(xiàn)插入排序核心代碼

  //插入排序:10萬隨機(jī)數(shù)據(jù)用時約7秒

  public static void sort(int[] arr) {

  //插入排序:從小到大,從前往后,先找位置后排序

  //外層循環(huán)確定輪次:從第二個到最后一個,n-1輪

  int j;

  for(inti=1; i  //內(nèi)存循環(huán)先找位置:從后(i-1)前找,最多找到0

  for(j=i-1; j>=0; j--) {

  //如果找到了比當(dāng)前數(shù)小的,退出//三種情況都確定了j+1為當(dāng)前數(shù)應(yīng)該排的位置

  if(arr[j]   break;

  }

  }

  //再交換排序

  int temp = arr[i];

  //從[j+1,i-1]通通往后退一格

  for(int k=i-1;k>=j+1;k--) {

  arr[k+1] = arr[k];

  }//j+1這個位置讓我排

  arr[j+1] = temp;

  }

  }

  2.3 選擇排序

  2.3.1 基本思想   選擇排序是在待排序的一組數(shù)據(jù)元素中,選出最小的一個數(shù)據(jù)元素與第一個位置的數(shù)據(jù)元素交換;然后在剩下的數(shù)據(jù)元素當(dāng)中再找最小的與第二個位置的數(shù)據(jù)元素交換,循環(huán)到只剩下最后一個數(shù)據(jù)元素為止。它的比較次數(shù)是一定的:n(n-1)/2。因此無論何種序列,正序和反序數(shù)據(jù)耗時相差不多,相差的只是數(shù)據(jù)移動時間,對數(shù)據(jù)的有序性不敏感。它雖然比較次數(shù)多,但它的數(shù)據(jù)交換量卻很少。如圖4所示。

  2.3.2 JAVA語言實(shí)現(xiàn)選擇排序核心代碼

  //選擇排序:10萬隨機(jī)數(shù)據(jù)用時約8秒

  public static void selectsort(int[] arr) {

  //外層循環(huán)確定輪次(n-1)

  int min;

  int index;

  for(inti=0; i  //內(nèi)層循環(huán)確定比較和交換范圍

  min = arr[i];

  index = i;

  for(int j=i+1;j  //比較和交換

  if(min >arr[j]) {

  min = arr[j];

  index = j;

  }

  }

  if(i != index) {

  int temp = arr[i];

  arr[i] = arr[index];

  arr[index] = temp;

  }

  }

  }

  2.4 歸并排序

  2.4.1 基本思想

  歸并排序要求待排序列已經(jīng)部分有序。部分有序的含義是待排序列由若干個有序的子序列組成。歸并排序的基本思想是:將這些有序的子序列進(jìn)行合并,從而得到有序的序列。合并是一種常見運(yùn)算,其方法是:比較各子序列的第一個記錄的鍵值,最小的一個就是排序后序列的第一個記錄的鍵值。取出這個記錄,繼續(xù)比較各子序列現(xiàn)在的第一個記錄的鍵值,便可找出排序后的第二記錄。如此繼續(xù)下去,最終可以得到排序結(jié)果。因此,歸并排序的基礎(chǔ)是合并,如圖5所示。

  2.4.2 JAVA 語言實(shí)現(xiàn)歸并排序核心代碼

  //歸并排序:10萬隨機(jī)數(shù)據(jù)用時約15毫秒

  public static void merge(int[] arr,int from,int mid,int end,int[] temp) {

  //分配大數(shù)組空間

  //int[] arr = new int[a。length+b。length];

  //定義三個下標(biāo)分別指向a,b,arr

  inti=from,j=mid+1,k=from;

  //比較,取值,直到其中一個數(shù)組結(jié)束

  while(i<=mid && j<=end) {

  if(arr[i]   temp[k++] = arr[i++];

  }else {

  temp[k++] = arr[j++];

  }

  }

  while(i<=mid) {

  temp[k++] = arr[i++];

  }

  while(j<=end) {

  temp[k++] = arr[j++];

  }

  for(int index=from;index<=end;index++) {

  arr[index] = temp[index];

  }

  }

  public static void sort(int[] arr,int from,int to,int[] temp) {

  if(from < to) {

  int mid = (from+to)/2;

  //遞歸

  sort(arr,from,mid,temp);

  sort(arr,mid+1,to,temp);

  //合并

  merge(arr,from,mid,to,temp);

  }

  }

  3 排序方法的性能比較及選擇

  3.1 性能對比

  我們可以通過一些基本的性能標(biāo)準(zhǔn)對各個排序方法進(jìn)行總結(jié)對比,見表1。

  3.2 影響排序效果的因素

  上述介紹的4種排序方法,因?yàn)椴煌呐判蚍椒ㄟm應(yīng)不同的應(yīng)用環(huán)境和要求,所以選擇合適的排序方法應(yīng)綜合考慮下列因素:

  ①待排序的記錄數(shù)目n;

 、谟涗浀拇笮(規(guī)模);

  ③關(guān)鍵字的結(jié)構(gòu)及其初始狀態(tài);

 、軐Ψ(wěn)定性的要求;

 、菡Z言工具的條件;

 、薮娼Y(jié)構(gòu);

 、邥r間和輔助空間復(fù)雜度等。

  3.3 排序方法的選擇

 、偃鬾較小(如n≤50),可采用插入排序或選擇排序。當(dāng)記錄規(guī)模較小時,插入排序較好;否則因?yàn)檫x擇排序移動的記錄數(shù)少于插人排序,應(yīng)選選擇排序?yàn)橐恕?/p>

 、谌粑募跏紶顟B(tài)基本有序(指正序),則應(yīng)選用插人排序、冒泡排序?yàn)橐?

 、谌鬾較大,則應(yīng)采用時間復(fù)雜度為O(nlgn)的排序方法:歸并排序。

【JAVA語言的常見排序算法】相關(guān)文章:

java常見的排序算法的代碼09-20

Java排序算法06-17

java的常見排序方法08-31

java堆排序的算法思想的分析09-14

JAVA簡單選擇排序算法及實(shí)現(xiàn)10-02

Java常用的五大排序算法09-09

C語言冒泡排序算法實(shí)例06-15

冒泡排序算法原理及JAVA實(shí)現(xiàn)代碼方法10-16

教你JAVA語言快速排序的原理10-04

C語言中使用快速排序算法對元素排序的實(shí)例06-20