資料結構常用內排序

2021-10-10 06:01:10 字數 3690 閱讀 1937

以下排序均使用順序表作為排序資料的儲存結構

//順序表基本運算演算法   seqlist.h

#include #define maxl 100 //最大長度

typedef int keytype; //定義關鍵字型別為int

typedef char infotype;

typedef struct

rectype; //查詢元素的型別

void swap(rectype& x, rectype& y) //x和y交換

void createlist(rectype r, keytype keys, int n) //建立順序表

void displist(rectype r, int n) //輸出順序表

1、氣泡排序

一種典型的交換排序方法,其原理是兩兩比較排序資料元素的大小,發現兩個資料元素的次序相反時,即進行交換,直到沒有反序的資料為止。設想被排序的陣列array[0....n],垂直豎立,將每個資料元素看做有重量的氣泡,根據輕氣泡不能再重氣泡之下的原則,從下往上掃瞄,反覆進行。

注意:氣泡排序每趟產生的有序區一定是全域性有序區,也就是說每趟產生的有序區中的元素都歸位了。

#include #include "seqlist.h"

void bubblesort(rectype r, int n)

} }}int main()

; rectype r[maxl];

createlist(r,a,8);

bubblesort(r,8);

displist(r,8);

return 0;

}

在排序時經常會發現,在第i趟已經排好了,但是仍然指定後邊幾趟的比較。實際上一旦在某一趟比較中沒有出現元素交換,則說明已經排好了,後邊的比較就變成了多餘的了。下邊是改進版的氣泡排序。僅僅是加入乙個bool標誌來標識某一趟有沒有發生交換,如果發生就結束迴圈。

void bubblesort1(rectype r, int n)

} if (!exchange)

return;

}}

演算法分析:最好情況(初始序列已經是正序)時間負責度為o(n)、最壞情況為o(n²),平均時間複雜度為o(n²),接近最壞情況,在時間效能上比直接插入排序差。

空間複雜度o(1)。最後氣泡排序是一種穩定排序方法。

2、快速排序

快排由氣泡排序改進而來。

基本思想是在待排序的n個元素中任取乙個元素,(通常去第乙個元素為基準),把該元素放進適當位置後,資料序列此時被基準分成兩部分,左邊的元素都比基準小,右邊的元素都比基準大。一趟劃分過程採用從兩頭向中間掃瞄的辦法,同時交換與基準元素逆序的元素。

之後對產生的兩個部分分別重複以上一趟劃分,直至每部分內只有乙個元素或沒有為止。快速排序每趟僅將乙個元素歸位。

#include "seqlist.h"

int partition(rectype r, int s, int t) //一趟劃分

r[i] = tmp;

return i;

}void quicksort(rectype r, int s, int t) //對r[s...t]排序

}int main()

; rectype r[maxl];

createlist(r,a,8);

quicksort(r,0,7);

displist(r,8);

return 0;

}

int once_quick_sort(vector& v, int left, int right)

if (left < right) //若找到,完成替換

while (leftv[left])

if (left < right) //若找到,完成替換

v[left] = key; //完成一次排序,left與right相遇,將key 賦值給left,並返回

return left; }}

void quick_sort(vector& v, int left, int right)

演算法分析:先不寫了。對數打不出來

插入排序的思想是:每次將乙個待排序的元素按其關鍵字大小插入到前面已經排好序的子集中的適當位置,知道全部元素插入完成為止。

1、直接插入排序

直接插入排序的一次操作是將當前無序區的乙個元素插入到有序區的適當位置,結果是有序區元素加一,這種方法稱為增量法,因為它每次使有序區增加乙個元素。

每趟產生的有序區不一定是全域性有序區。

將無序區乙個元素r[i]插入到有序區的過程:將r[i]暫存到tmp,j在有序區從後往前比較,凡是比tmp.key大的元素均後移乙個位置,若找到某個關鍵字<=tmp.key,則將tmp插入到它後邊

#include "seqlist.h"

void insertsort(rectype r, int n)

while (j >= 0 && r[j].key > tmp.key); //有序區的元素大於將要插入的元素

r[j + 1] = tmp; //+1的原因在於 先do{}

} }}int main()

; rectype r[maxl];

createlist(r,a,8);

insertsort(r,8);

displist(r,8);

return 0;

}

演算法分析:最好情況(初始序列已經是正序)時間負責度為o(n)、最壞情況為o(n²),平均時間複雜度為o(n²),接近最壞情況。

空間複雜度o(1)。直接插入排序也是一種穩定排序方法。

2、折半插入排序

在直接插入的基礎上,由於有序區元素是有序的,因此可以使用折半查詢的方法先找到插入位置,再通過移動元素進行插入。

每趟產生的有序區不一定是全域性有序區。

void bininsertsort(rectype r, int n)

for (int j = i - 1; j < high + 1; j--) //元素後移

r[j + 1] = r[j];

r[high + 1] = temp; //插入temp

} }}

演算法分析:平均時間複雜度為o(n²)  ,一種穩定的排序方法。比起直接插入排序在效能上並沒有很大改善。

3、希爾排序(shell sort)

#include "seqlist.cpp"

void shellsort(rectype r,int n) //希爾排序演算法

} swap(arr[i], arr[k]); //用無序區中最小元素交換無序區中第乙個元素

for (int q = 0; q < 8; q++)

cout << endl; }}

void select_sort_pro(int* arr, int size)

if (arr[i] > arr[right])

}left++;

right--;

}}

----------------今天先寫到這------------------

資料結構 排序 內排序總結

1.時間複雜度總結 n2 直接插入排序,氣泡排序,簡單選擇排序 這三種裡面直接插入排序好一點 nlogn 快速排序,堆排序,歸併排序 n 基數排序 其他 n2 2.時間效能與初始序列無關 口訣 一堆烏龜選 堆排序,歸併排序,基本選擇排序,基數排序 3.空間效能 快速排序 logn 歸併排序 n 基數...

資料結構 內排序 Java實現

都說資料結構是我們程式設計師的基本功之一,那麼內排序就是資料結構裡必不可少的重要部分。所以自己在學習這部分內容的同時也希望能給大家帶來更多的東西,希望你能有所收穫!在排序過程中,整張表都是在記憶體中處理,不涉及內 外存的資料交換,稱之為內排序。反之,排序過程中需涉及內外存交換的,稱之為外排序。排序過...

資料結構 資料結構中常用的排序演算法

排序是資料結構中重要的內容,也是面試過程中經常涉及的部分。在這裡,我給出幾個基本的排序演算法的c c 對於具體的排序的原理,不做太多的介紹,隨便找一本資料結構教材都能弄清楚。宣告 1 以下給出的 並沒有判斷邊界條件,只是給出了演算法的核心 如果遇到具體的問題,應該加以判斷。2 演算法實現的是公升序排...