簡單總結一下快速排序和歸併排序的用法,這兩種方法十分省時,在題目中常用。
快速排序
基本思想通過一趟排序將代拍記錄分成兩部分,一部分記錄關鍵字比另一部分小,再對這兩部分記錄繼續排序,達到整個序列有序。具體做法是附設兩個指標i和j,初值分別為l,r,任選乙個記錄做樞紐取mid,首先從j位置向前搜找到第乙個關鍵字小於mid的記錄,再從i所指位置向後搜尋,找到第乙個大於mid的記錄,將它們互相交換,重複兩步直到i>j;
實現**
#include
using namespace std;
int a[100001];
void qsort(int l,int r)
}while(i<=j);
if(l>n;
for(i=1;i<=n;i++)
cin>>a[i];
qsort(1,n);
for(i=1;i<=n;i++)
cout《快排時間複雜度o(nlog2n) 但不穩定,就平均時間來講,是目前最好的內部排序方法。
歸併排序
先使每個子串行有序再使子串行段間有序,分兩大步,分解合併,合併過程為:比較a[i],a[j]大小,若a[i]<=a[j],將第乙個有序表中元素a[i]複製到r[k]中,並令i,k加一,否則,將第二個有序表中元素a[j]複製到r[k]中,並令j,k加一,迴圈下去直到其中乙個有序表取完,然後再將另乙個有序表中剩餘元素複製到r中從下標k到t的單元,歸併演算法通常用遞迴實現。
實現**
void msort(int s,int)
{if(s==t) //如果只有乙個數字返回無需排序
return;
int mid=(s+t)/2;
msort(s,mid); //分解左序列
msort(mid+1,t); //分解右序列
int i=s,j=mid+1,k=s; //合併開始了
while(i<=mid&&j<=t)
{if(a[i]<=a[j])
{r[k]=a[i];
k++;
i++;
else
{r[k]=a[j];
k++;
j++;
while(i<=mid) //複製左序列剩餘
{r[k]=a[i];
k++;
i++;
while(j<=t) //複製右序列剩餘
{r[k]=a[j];
k++;
j++;
for(int i=s;i<=t;i++)
a[i]=r[i];
歸併時間複雜度o(nlog2n) 速度快同時穩定
歸併排序與快速排序
1.演算法簡介 歸併排序和快速排序都是採用遞迴的結構實現的,不同的是歸併排序在遞迴過程中有合併子串行的過程,而快速排序中沒有,但是快速排序中有較為複雜的劃分過程。二者的平均時間複雜度均為o nlgn 其中快速排序的係數較小 歸併排序最壞情況複雜度為o nlgn 快排在最壞情況下時間複雜度為o n 2...
歸併排序與快速排序
1.分治思想顧名思義,就是分而治之的意思,將大問題換分為無數個小問題,小的問題解決了,大的問題自然也就解決了。分之演算法一般都是用遞迴來實現的。分治是一種解決問題的處理思想,遞迴是是一種程式設計技巧。2.歸併排序歸併排序的核心思想 就是講乙個陣列分為前後兩部分分別進行排序,然後將有序的兩個陣列再合併...
歸併排序與快速排序
void merge sort int arr,int l,int r private static void quicksort int arr,int low,int high private static int getindex int arr,int low,int high 如果隊尾元素...