歸併排序
實現思想:
歸併的含義很明顯就是將兩個或者兩個以上的有序表組合成乙個新的有序表。
歸併排序中一般所用到的是2-路歸併排序,即將含有n個元素的序列看成是n個有序的子串行,
每個子串行的長度為1,而後兩兩合併,得到n/2個長度為2或1的有序子串行,再進行兩兩合併。。。
直到最後由兩個有序的子串行合併成為乙個長度為n的有序序列。
2-路歸併的核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙個有序序列。
2-路歸併的**:
/*
蔣有緒的arr[start...mid]和有序的arr[mid+1...end]
合併為有序的arr[start...end]
*/void merge(int *arr,int start,int mid,int end)
//將arr 序列中剩餘的元素複製到brr
while(i<=mid)
brr[k+]=arr[i++];
while(j<=end)
brr[k++]=arr[j++];
//將brr 複製到arr,使arr[start..end]有序
for(i=0;i為了避免遞迴使用malloc和free,用這種經典的實現方式
void merge(int *arr,int *brr,int start,int mid,int end)
while(i<=mid)
brr[k++]=arr[i++];
while(j<=end)
brr[k++]=arr[j++];
for(i=0;i歸併排序的最好最壞和平均時間複雜度都是o(n*logn),但是需要額外的長度為n的輔助陣列
快速排序:
實現思想
快速排序的基本思想如下:
1、從待排序列中任選乙個元素作為樞軸;
2、將序列中比樞軸大的元素全部放在樞軸的右邊,比樞軸小的元素全部放在其左邊;
3、以樞軸為分界線,對其兩邊的兩個子串行重複執行步驟1和2中的操作,直到最後每個子串行中只有乙個元素。
void quick_sort(int *arr,int low,int high)
}
通常,快速排序被認為在所有同數量級(平均時間複雜度均為o(n*logn))的排序方法中,平均效能最好
所以通常樞軸元素的選擇一般基於「三者取中」的原則,即比較首元素、末元素、中間元素的值,取三者中中間大小的那個。
快速排序 歸併排序
感覺好久之前不寫這些基礎的東西忽然覺著,想複習一下,就簡單溫習一下排序的例子 package com.ruishenh.algoritmic public class sort static void printmsg int arrs system.out.println static int g...
快速排序,歸併排序
快速排序 quicksort 是對 氣泡排序的一種改進。設要排序的 陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。需要注意的是,多個相同的值的相對位置也許會在演算法結束時產...
排序 歸併與快速排序
歸併排序思想 將陣列一分為二 折半 分別將兩部分陣列進行排序 將排序好的兩部分陣列進行合併成新的有序陣列。動態圖演示 演算法實現 利用分治演算法,自頂向下的進行遞迴排序。動態圖演示則為自下往上的排序演示。public static void main string args sort array,0...