java講講幾種常見的排序算法


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

后面會繼續更新幾種常見排序算法。

我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鍾、半秒鍾,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫博客的初衷)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM