快速排序與歸併排序

2021-08-15 04:18:20 字數 1311 閱讀 3776

簡單總結一下快速排序和歸併排序的用法,這兩種方法十分省時,在題目中常用。

快速排序

基本思想通過一趟排序將代拍記錄分成兩部分,一部分記錄關鍵字比另一部分小,再對這兩部分記錄繼續排序,達到整個序列有序。具體做法是附設兩個指標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 如果隊尾元素...