一、歸併排序
遞迴實現===》自上向下
非遞迴排序===》自下向上
void merge(int arr,int low,int mid,int high,int tmp)
using namespace std;
int partition1(int arr,int low,int high)//優化1
if(i>=j)
break;
swap(arr[i],arr[j]);
} swap(arr[low],arr[j]);
} return j;
}int partition2(int arr,int low,int high)//優化2
} return j;
}int partition3(int arr,int low,int high)//優化3
} if(mark==false)
break;
}}
時間複雜度分析:假設問題規模為n
需要比較n-1趟,
第一趟比較n-1次
第二趟比較n-2次
第n-1趟比較1次
總共比較次數:1+2+3+……+n-1=(n(n-1))/2
時間複雜度為o(n^2)
穩定性:
穩定三、選擇排序
(1)、堆排序
void sink(int arr,int len,int rootindex)//下沉法進行堆調整;小堆根
if(root>arr[childindex])//*1
else
break;
} arr[rootindex]=root;//*2
/* 當實現元素交換時只進行子節點元素上移,較小的父節點是通過*2這一句實現的
*/}void heepsort(int arr,int len)
}
時間複雜度分析:假設問題規模大小為n
時間複雜度為建堆花費時間加上「刪除」最小元素花費時間之和。
i.n個元素的堆,高度為h的節點最多有n/(2^(h+1))
ii.n個元素的堆的高度為floor(log2n)(log2
n向下取整)
設高度為h的節點向下交換的代價為o(h)
建堆的時間複雜度為不同高度的每個節點向下交換的代價之和t1=(n/(2^2)+n/(2^3)+……+n/(2^(h+1)))*o(h)其中h==o(n)
故實時間複雜度為o(nlog2n)
最後兩時間相加堆排序的時間複雜度為o(nlog2n)
穩定性:
不穩定(2)、直接選擇排序
void selete_sort(vector&vec)
vec[j+gap_len]=tmp; }}
void shellsort(vector&vec)
時間複雜度:時間複雜度為o(n^1.3),實際時間複雜度為o(log2n)~o(n^2)
穩定性:
不穩定(2)、直接插入排序
void insertsort(vector&vec)
}
時間複雜度分析:假設問題規模為n
需要插入n-1次,每次插入需要比較n-1次
t(n)=1+2+3+……+n-1=(n(n-1))/2
時間複雜度為o(n^2)
穩定性:
穩定五、總結
1、平均效能為o(n^2)的有:直接插入排序、選擇排序、氣泡排序。當資料量較小時,這三種排序差不多;當資料量較大時,氣泡排序時間代價最高。
2、平均效能為o(nlog2n)的有:快速排序、歸併排序、希爾排序、堆排序。當資料量大時,這三種排序較好;當資料是隨機的時,快排平均時間最短;但在基本有序的情況下,快排反而不好;若要求穩定,則選歸併。
3、若資料初始基本有序(正序),選直接插入或者冒泡或者隨機的快排。
排序演算法 直接交換排序 歸併排序 快排
直接交換排序 遍歷未排序陣列,每次找出其中最小值,將其置入已排序的陣列中。code void select int a,int n swap a temp a i 歸併排序 分治,將乙個數字從中切開,分為兩個陣列,對兩個陣列進行排序,之後合併。code void mergearr int a,int...
氣泡排序,選擇排序,插入排序,歸併排序
1.氣泡排序 氣泡排序的思想,將陣列分為已排 右邊 和未排 左邊 兩部分。排序時每次在未排部分從左向右一次比較相鄰2個元素,如果左大於右則互換位置。每次都是指標從左邊第乙個依次相鄰比較,到指標指向倒數第二個未排結束比較。test 氣泡排序 public void fun4 int left 0 陣列...
選擇排序 氣泡排序 歸併排序 快速排序 插入排序
選擇排序 private static void selectsort int arr,int n 氣泡排序 private static void bubblesort in arr,into n 歸併排序 private static void mergesort int arr,int n p...