八大排序演算法

2021-07-22 16:43:58 字數 3657 閱讀 8850

一 .概述

八大排序演算法包括

1)插入排序之直接插入排序(straight insertion sort)

2)插入排序之希爾排序(shells sort)

3)選擇排序之簡單選擇排序(****** selection sort)

4)選擇排序之堆排序(heap sort)

5)交換排序之氣泡排序(bubble sort)

6)交換排序之快速排序(quick sort)

7)歸併排序(merge sort)

8 )桶排序/基數排序(radix sort)

二.詳解

1.插入排序—直接插入排序(straight insertion sort)

1)基本思想: 將乙個數插入到前面已排序好的有序表中,從而得到乙個新記錄數增1的有序表。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

穩定排序:在原序列中遇到乙個和插入元素相等的,那麼把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,所以插入排序是穩定的。

2)**

void print(int a, int n ,int i)  

couta[j+1] = x; //插入到正確位置

} print(a,n,i); //列印每趟排序的結果

} } int main();

insertsort(a,8);

print(a,8,8);

}

對位置i的元素x進行插入分4步:儲存->查詢->移動->插入

step1.先儲存x.

step2.對其左邊位置[0,i-1]元素從右往左遍歷,找出第乙個比x小或等的元素xsmall,假設xsamll的位置為pos.

step3.將[pos+1,i-1]處的元素在插入前向後移動一位。

step4.把x插入到xsmall的後面,即把x放到pos+1的位置。

size_t findfirstminpos(vector

&a,size_t i)

void mov(vector

&a,size_t i,size_t j)

void insertsort(vector

& a)

}

2.希爾排序

1)基本思想

又叫縮小增量排序,將待排序數列按增量分成若干個子串行,利用直接插入排序思想對子序列進行排序。

2)**

int findfirstmin(int a,int n,int stepp,int i)

void mov(int a,int stepp,int

s,int e)

}void shellsort(int a,int n,int stepp)

}void shellinsersort(int a,int n,int step,int

m)

3.簡單選擇排序

4.堆排序

1)基本思想

在堆中,堆的根節點的元素值一定是所有節點元素的最大值或最小值。如果將堆中根節點輸出之後,將其餘n-1個節點的元素值重新建立乙個堆,則新堆的堆頂元素值是次大(或次小)值,將該堆頂元素輸出。這樣重複建堆並輸出堆頂元素的過程稱為堆排序。

2) a.建堆:從最後乙個非葉子節點開始調整堆,使得從該節點往下都是堆(葉子節點相當於乙個堆)

b.調整堆函式:void adjustheap(int a,int s,int m) 第二個引數表示以s為根調整建立堆,m是要調整的a的總長度。從s開始調整說明s的下層都已經調整好了,需要把s插入到下層的某個位置。

也就是在a[s—m]中a[s]是唯一乙個不符合堆規則的元素,需要調整。

3)給出一列有n個元素的陣列(從位置1開始放),利用堆排序法進行排序的過程:

step1 由這n個數建立乙個堆(本文用大頂堆);

step2 當最後乙個元素還沒有走到第乙個元素的時候

step2.1 輸出堆頂元素(將堆頂元素和最後乙個元素交換);

step2.2 調整堆。

void adjustheap(int a,int s,int n)   //呼叫函式1

a[s]=k;

}void createheap(int a,int n)//呼叫函式2

void heapsort(int a,int n) //主排序

}

5.氣泡排序

6.快速排序(不穩定排序)

1)基本思想

陣列data[1…n]放n個待排序元素,初始時,令left=1,right=n,令a[1]作為參考元素,然後按以下操作:

a.從right位置往前減,依次與參考元素比較,若大於等於參考則繼續前移,若小於則將right處元素移到left處,令left++,進入b步驟。

b. 從left位置往後增,依次與參考元素比,若小於參考則繼續後增,反之,將left處元素移到right處,令right–,進入a步驟。

2)**

tips:一次快排使得樞軸前面的元素都小於樞軸元素,樞軸後面的元素都大於等於樞軸元素。

int

partition(int a,int left,int right)//呼叫函式

void quicksort(int a,int left,int right) //主排序

}

7.歸併排序

將兩個有序的s[low…mid]和s[mid+1…high]子串行歸併為乙個有序的序列t[low…high]:

void merge(int s,int t,int low ,int mid ,int high)

while(i<=mid) t[k++]=s[i++];

while(j<=high) t[k++]=s[j++];

}void mergesort(int s,int t,int low,int high)

}

8 .桶排序/基數排序(radix sort)

方法一、用二維陣列

int getsorttimes(int n) //最大數的位數即為桶排序的次數

return

count;

}int getitsnum(int num,int n)//獲取數num的第i位數,第1位為個位

void distribute(int a,int n,int buck[10][20],int pos,int

index[10])

}}void collect(int a,int n,int buck[10][20],int

index)

index[i]=0;

}}void radix_sort(int a,int n)

; int bucket[10][20];//乙個10個桶,每個桶最多放20個數

int max=a[0];

for(int i=0;iif(a[i]>max) max=a[i];

int sorttimes=getsorttimes(max);

for(int i=0;i1,index);

connect(a,n,bucket,index);

}}

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...

八大排序演算法

排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...

八大排序演算法

八大排序演算法 概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。我們這裡說說八大排序就是內部排序。當n較大,則應採用時間複雜度為o nlog2n 的排序方法 快速排序 堆排序或歸併排序序。快速排...