陣列常用排序演算法

2021-08-15 10:32:10 字數 1802 閱讀 3811

今天覆習到陣列部分,發現陣列部分中比較重要的可能就是排序這個問題了。其他像遍歷、填充替換陣列元素、複製陣列、查詢陣列等都相對簡單,就把排序部分稍作整理。沒什麼高深知識,隨便看看就好。

首先貼出氣泡排序和直接選擇排序的**,兩者相近且比較簡單,本來打算分著寫更明顯,不過看著實在太短了,就在乙個類中寫出了,類名也沒改,大家將就看吧=。=

public

class bubblesort ;

bubble(a);

select(a);

}public

static

void

bubble(int arr)}}

for(int x:arr)

system.out.println();

}public

static

void

select(int arr)

}int temp;

temp=arr[arr.length-1-i];

arr[arr.length-1-i]=arr[index];

arr[index]=temp;

}for(int x:arr)

}}

在我看來,氣泡排序和直接選擇排序相近。兩者的比較次數相同,交換次數:氣泡排序》直接選擇排序,**有一定的相似性。

兩者**都是有巢狀的兩層for迴圈作為主體,氣泡排序是相鄰兩數比較,若前者大於後者,則交換位置,直接選擇排序則是一輪迴圈下來用乙個index標記此輪迴圈的最大值,然後在內層for迴圈結束後進行本輪最後乙個位置和最大值的交換。

而快速排序和他們則有所區別。

public

class quicksort ;

quicksort(arr, 0, arr.length - 1);

//quick(arr,0,arr.length-1);

for (int x : arr)

}public

static

void

quicksort(int arr, int top, int end)

}public

static

intpartition(int arr, int top, int end)

arr[top] = arr[j];

arr[j] = x;

return j;

}public

static

void

quick(int a, int left, int right)

}a[j + 1] = ai;//到此會發現i+1位之前都是從小到大排序,即每完成一輪迴圈,陣列前面的數就多乙個有序的。}}

}

快速排序則和他們完全不同。快速排序用到了分治思想,用遞迴演算法達到將陣列分割,簡化排序過程。

每一次呼叫quicksort()方法都會將當前陣列分成三部分:首項、>首項、《首項。

分別在後兩個陣列中再呼叫quicksort()方法,分割的下標則是由partition()方法決定的partition為「劃分」意,在這裡用來找到首項應該在的下標位置。

上述**中還出現了乙個方法quick(),這個方法是從arrays.sort()方法的原始碼中找到的,一開始我認為是快速排序的乙個非遞迴化變形,後來發現似乎不是如此,這個方法是從第乙個數開始,不斷的往後擴充套件,沒新增乙個數就找到這個數應當在的前面的位置,感覺類似直接選擇排序的倒敘版,但是他每一次又不會遍歷整個陣列,所以說我也拿不準究竟如何形容他,不過他玲瓏的**段還是驚豔到我了,果然程式設計是一門藝術活,總有一些神奇的**片有著匪夷所思的用處。

如有不妥,敬請交流指教。

常用基礎陣列排序演算法

解題思路 1 1 n個數字,自己 與 下一位 比較,選中最大的放在 下一位 再以 下一位 為 自己 與 下一位 比較,直到選出最大的數字放在最後 2 1 n 1 個數字,重複第一步驟操作 n 直到剩下最後乙個數字 思路 解題思路 1 從1 n 個數字中選擇最小的數字放在 第乙個 2 從2 n 個 重...

陣列的常用排序演算法 二

這是乙個陣列的常用方法的引用,比如 陣列的冒泡查詢,選擇排序,二分法查詢 author along version 1.0 public class arraytool param int 求陣列的最大值 return int 返回乙個整型的最大值 public static int getmax ...

Java陣列常用排序演算法實現複習

冒泡演算法由雙層迴圈實現,其中外層迴圈用於控制排序輪數,一般是要排序的陣列長度減1次,因為最後一次迴圈只剩下乙個陣列元素,不需要對比,同時陣列已經完成排序了。而內層迴圈主要用於對比陣列中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數以排序輪數而減少。演算法實現 package captain...