幾種常見的排序演算法及其演算法思路:
1.選擇排序 o(n方)
所謂選擇就是每次都選擇乙個最小的元素放在最前面。思路是去尋找最小元素的座標,然後將最小座標的元素與當前座標的元素交換。具體的做法是假設當前迴圈的第乙個座標是最小元素的座標,然後從第二個元素開始遍歷(內層迴圈),如果該元素比最小座標的的元素小,就把最小元素的座標修改為該元素的座標,最後交換選出的最小元素座標所在的元素和當前外層迴圈正在處理的元素兩個元素,實現**如下:
//2.插入排序 o(n方)交換陣列中的兩個元素
private static void
swap(int arr, int i, int j)
//選擇排序
public static void
selectsort(int arr)
}}
插入排序的操作和排序撲克牌的操作及其相似,目標就是每個元素都選擇正確的位置進行插入,使得該序列始終處於有序狀態。想象以下你打撲克牌的摸牌的時候,摸第一張牌,他本身就是有序的,無需任何操作,摸第二張牌就要考慮下,較小就放前面,較大就放後面,剩下的牌插入時,從後往前看,比前面的小就交換一次,直到比前面大就說明找到了合適的位置。最後完成插入排序,可以看出插入排序有提前結束內層迴圈的機會,所以它在排序較為有序的序列時速度很快,以下是**實現:
//3.快速排序o(n*logn)插入排序
public static void
insertsort(int arr)
}}
快速排序本身是一種分治演算法,即把乙個大問題拆成多個相同的結構的小問題,然後遞迴解決小問題,大問題也就得到了解決。快速排序把問題拆分成乙個個小的partition操作,partition操作是選擇乙個參考元素,並使得參考元素左邊的元素都比他小,右邊的都比他大.操作的具體做法為:選擇要排序序列左端點的元素v為參考元素,把序列分為左parta,和右partb兩個部分,使得parta都比v小,partb都v大,用 j 這個元素記錄parta的最後乙個元素的座標(初始值為左端點l),從v後面的元素向右端點遍歷,如果比v小,parta容量+1(j++),並把它作為parta的最後乙個元素 ,比v大就不作任何操作,最後將參考元素 v(座標為l),與parta最後乙個元素(座標為j)兩個元素交換位置完成partition操作,並返回參考元素最後所在位置(j),之後在遞迴對j左右兩邊進行快速排序,排序完成。
//4. 歸併排序(o(n*logn))快速排序
public static void
quicksort(int arr)
private static void
qsort(int arr, int l, int r)
private static int
partition(int arr, int l, int r)
}swap(arr, l, j);
return j;
}
歸併排序也是一種分治演算法,這裡只說自下而上的歸併排序的實現,歸併排序的基本思想是採用二分的方式對序列進行分割,當分到每一小塊都只有乙個元素時,每個片段就都是有序的,然後自下而上進行merge(歸併操作),所以,歸併排序的核心也是這個merge操作,歸併操作需要借助乙個輔助的空間來協助我們排序,首先歸併時左右兩個半邊都須是有序的,具體思路如下:開闢乙個和原要歸併序列相同的輔助序列,然後對原序列的每個座標(用k表示)進行選舉操作,即從輔助序列中選舉出合適的元素放在該座標,直至遍歷完原序列的每乙個座標。用 i 這個元素標記輔助序列左半邊正在處理元素的座標,用 j 這個元素標記輔助序列右半邊正在操作的座標,然後將i所在的元素與j所在的元素進行比較,誰更小就作為被選中的目標放在原序列正在處理的座標上,並且該半邊正在操作的元素的座標後移一位,即(i++或j++),當然如果某半邊操作完成,原序列選舉時沒的可選,就把剩餘半邊未操作的元素依次放在原序列正在選舉的座標上,完成該序列的歸併操作,最終通過遞迴的方式完成歸併排序,以下是**實現:
//5.堆排序歸併排序
public static void
mergesort(int arr)
private static void
msort(int arr, int l, int r)
private static void
merge(int arr, int l, int mid, int r) else if (j > r) else if (temp[i - l] < temp[j - l]) else
}}
堆排序就是借助堆(heap)這種特殊的資料結構進行排序。堆是一顆完全的二叉樹(即除了最後一層,每一層節點的個數都是飽和的,且最後一層即使不飽和,節點也都集中在左側),可以通過實現乙個最大堆來實現堆排序,最大堆(所有父節點都大於它的子節點),下面是使用陣列的方式實現乙個最大堆,從陣列座標為的1的位置開始存放元素,這樣,每個元素左孩子座標為父節點座標的兩倍,右孩子是父節點座標的兩倍+1, 入堆和出堆操作時使陣列始終保持最大堆的特性,核心是兩個shift操作。下面是最大堆**實現 。
public class maxheapextends comparable>public
maxheap(item items)
// 向最大堆中插入乙個新的元素
item
public void
insert(item item)
// 向最大堆中取出入乙個新的元素
item
public
item
extacttop()
private void
swap(int i,int j)
private void
shiftup(int k)
}private void
shifdown(int k)
}public static void
main(string args)
//// for(int i=1;i<100;i=i+2)
integer arr=new integer;
maxheap maxheap=new maxheap(arr);
for (int i=0
;ilength
;i++)
}}
常見的排序演算法(大致思路)
1 氣泡排序 從頭到尾比較相鄰兩個元素,如果前乙個元素比後乙個元素大,就交換他們的順序。迴圈執行,直到不需要再交換順序。2 插入排序 從第乙個元素開始,此時第乙個元素可以被認為是有序的序列。然後再每次選取後面的未排序的元素,將它與已經排好序的序列比較,從尾到頭比較,如果這個元素比有序序列當前位置的元...
常見演算法思路總結
1.刪除單鏈表p指向的那個元素 有三個思路 1 前頭結點開始查詢,得到其前驅結點,然後刪除,此時時間複雜度為o n 2 利用雙向鍊錶,此時時間複雜度為o 1 3 當該結點不是鍊錶尾部元素時,將它後面的結點值儲存起來 賦給p 刪除其結點 當該結點是最後乙個元素時,從頭結點遍歷,此時時間複雜度為o n ...
幾種排序演算法的思路及其Python實現
1.快速排序 def quick sort alist,first,last if first last return mid value alist first low first high last while low while low mid value high 1 alist low a...