java講講幾種常見的排序算法(一)
目錄
以數組array={6,3,20,8,15,1}為例
冒泡排序
思路:從第0個到第n個,和相鄰的元素進行相比,如果比相鄰的大的話,那么就交換二者順序,這樣的話0到n范圍內的最大的數就放到n的位置。接着下一次操作,第0個到第n-1個,將0到n-1范圍內的最大值放到n-1。重復執行,最后數組從小到大排列。

public static void bubble(int array[])
{
for (int i = array.length-1; i >0;i--) {
for(int j=0;j<i;j++)
{
if(array[j]>array[j+1])
{
swap(array,j+1,j);
}
}
}
}
排序過程:
3 6 8 15 1 20
3 6 8 1 15 20
3 6 1 8 15 20
3 1 6 8 15 20
1 3 6 8 15 20
選擇排序
思路:遍歷第i到第n個,找到i到n范圍內最小的數,然后放在i的位置。接着遍歷i+1到第n個,找到i+1到n范圍內最小的數,然后放在i+1的位置,重復執行下去,最后數組從小到大排列。

public static void selectSort(int array[])
{
for (int i = 0; i < array.length; i++) {
int min=array[i];
int index=i;
for (int j = i; j < array.length; j++) {
if(array[j]<min)
{
min=array[j];
index=j;
}
}
swap(array,index,i);
}
}
排序過程:
1 3 20 8 15 6
1 3 20 8 15 6
1 3 6 8 15 20
1 3 6 8 15 20
1 3 6 8 15 20
1 3 6 8 15 20
插入排序
思路:如第0到5范圍內的數從小到大排列,第六個數記為temp,此時第temp比第5個數小,那么第5個數往后退,接着再與第4個數比較,如果還是比第4個數小,那么第4個數繼續后退,接着如果不小於第3個數,這個時候將temp存到4的位置 。總的來說,就是在一個有序范圍內,插入一個該范圍之外的數,隨着執行下,有序范圍逐漸擴大,最后整體有序。

public static void insert(int array[])
{
for (int i = 1; i < array.length; i++) {
int temp=array[i];
int j=i;
while(j>0&&temp<array[j-1])
{
array[j]=array[j-1];
j--;
}
array[j]=temp;
}
}
排序過程:
3 6 20 8 15 1
3 6 20 8 15 1
3 6 8 20 15 1
3 6 8 15 20 1
1 3 6 8 15 20
希爾排序
思路:希爾排序是在插入排序的基礎上進一步改進的。
插入排序有可以改進的地方
- 插入排序每一次移動只能移動一位,而希爾排序可以按步長移動。
- 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率。
所以針對這兩點,希爾排序通過將比較的全部元素分為幾個區域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然后算法再取越來越小的步長進行排序,算法的最后一步就是普通的插入排序,但是到了這步,需排序的數據幾乎是已排好的了(此時插入排序較快)。
總的來說,希爾排序的最后一步是插入排序,但是在插入排序之前,實現了基本有序。

public static void shell(int array[])
{
int gap=array.length/2;
//控制步長
while(gap!=0)
{
for (int i = 0; i < gap; i++) {
//插入排序
for (int j = i+gap; j < array.length; j=j+gap) {
int temp=array[j];
int p=j;
while(p>=gap&&temp<array[p-gap])
{
array[p]=array[p-gap];
p=p-gap;
}
array[p]=temp;
}
}
gap=gap/2;
}
}
快速排序
最核心的思想是實現在一個范圍內,以n為基准點,左邊的數不大於基准點,右邊的數不小於基准點。接下來左邊的作為一個整體,同樣實現上面的要求,右邊的作為一個整體也實現上面的要求(左邊的數不大於基准點,右邊的數不小於基准點)。自頂向下執行下去,最后局部有序實現整體有序。

public static void quickSort(int array[],int start,int end)
{
if(start<end)
{
int n=findPoint(array,start,end);
quickSort(array,start,n-1);
quickSort(array,n+1,end);
}
}
public static int findPoint(int array[],int start,int end)
{
int temp=array[start];
while(start<end)
{
while(start<end&&array[end]>=temp)
{
end--;
}
if(start<end)
{
array[start]=array[end];
}
while(start<end&&array[start]<=temp)
{
start++;
}
if(start<end)
{
array[end]=array[start];
}
}
array[start]=temp;
return start;
}
排序過程:
1 3 2 6 8 12 7 15 20
1 3 2 6 8 12 7 15 20
1 2 3 6 8 12 7 15 20
1 2 3 6 7 8 12 15 20
1 2 3 6 7 8 12 15 20
1 2 3 6 7 8 12 15 20
