《大話資料結構》 排序

2021-08-25 22:26:01 字數 2809 閱讀 8178

排序的穩定性

ri = rj,在排序前ri領先於rj,如果排序後ri仍然領先於rj,則稱為所用的排序演算法是穩定的;反之,若可能使得排序後rj領先於ri,則稱為該排序演算法是不穩定的。

內排序和外排序

內排序:排序的整個過程中,待排序的所有記錄全部存放在記憶體中。常見的內排序演算法有:氣泡排序、簡單選擇排序、直接插入排序、希爾排序、歸併排序、堆排序、快排等。

外排序:排序的記錄數太多,不能同時放置在記憶體中,整個排序過程需要內外存多次交換資料才能進行。

1 氣泡排序

氣泡排序是一種比較簡單的排序演算法。較小的數字如同氣泡一樣慢慢浮到上面,因此命名為冒泡演算法。以下實現為氣泡排序的一種優化版,若後續序列已經有序,則就不需要再繼續迴圈判斷了

void bubblesort(int a, int n)}}

}

2 簡單選擇排序

選擇排序的基本思想是每一趟在n-i+1個記錄中選擇最小的記錄,作為有序序列的第i個記錄,並和原先第i個記錄交換

void selectsort(int a, int n)

if (i != min)

swap(a, i, min);}}

3 直接插入排序

直接插入排序的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的有序表。類似於抓撲克牌。右手抓牌,左手是已經排好序的牌:

void insertsort(int a, int n)

a[j + 1] = get

;//將拿到的牌,插入進去}}

4 希爾排序

前面幾種排序演算法的複雜度基本上都是o(n²),shell排序是突破這個時間複雜度的第一批演算法之一。shell排序是基於直接插入排序的一種改進版本,它的基本思想是:對於n個待排序的數列,取乙個小於n的整數increment(稱為步長)將待排序元素分成若干個組子串行,所有距離為increment的倍數的記錄放在同乙個組中;然後,對各組內的元素進行直接插入排序。 這一趟排序完成之後,每乙個組的元素都是有序的。然後減小increment的值,並重複執行上述的分組和排序。重複這樣的操作,當increment=1時,整個數列就是有序的。

void shellsort(int a, int n)

a[j + increment] = get;}}

}

5 堆排序

堆是完全二叉樹的一種,其每個結點的值都大於等於左右孩子結點的值(大頂堆,反之為小頂堆),而堆排序就是利用堆進行排序的方法。基本思想是:將待排序列構造成乙個大頂堆,堆頂的值就是最大值,將其與末尾元素互換,然後將剩餘的序列重新構造成乙個堆,如此反覆就能得到乙個有序序列。

void heapify(int a, int i, int n)// 從a[i]向下進行堆調整

}void heapsort(int a, int n)

}

6 歸併排序

利用歸併的思想實現排序的方法。將長度為n的序列看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到[n/2]個長度為2或者1的有序序列;然後再兩兩歸併,…如此反覆操作,直到得到乙個長度為n的有序序列。

while (i <= mid)//剩餘序列排序

while (j <= right)//剩餘序列排序

for (int k = 0; k < len; k++)

delete temp;

}void msort_recursion(int a, int left, int right)//遞迴實現,自頂向下

int mid = (left + right) / 2;

msort_recursion(a, left, mid);

msort_recursion(a, mid + 1, right);

merge(a,left,mid,right);

}7 快排

快排的基本思想:通過一趟排序將待排記錄分為兩個部分,其中一部分記錄的關鍵字比另外一部分記錄的關鍵字小,然後分別對這兩個部分繼續進行排序,以達到整體有序的目的

int partition(int a, int

left, int

right)

return left;

}void qsort(int a,int

left,int

right)

}

1 指標對比

(來自網上)

2 演算法分類

簡單演算法:冒泡、簡單選擇、直接插入

改進演算法:希爾、堆、歸併、快排

3 對比分析

①從最好、最壞、平均情況分析:平均情況來看,三種改進演算法要優於希爾排序,且遠遠勝過簡單演算法;從最好情況來看,冒泡和直接插入排序要更勝一籌;從最壞情況來看,堆和歸併排序要優於快排以及其他簡單演算法;

②從空間複雜度分析:歸併和快排有相應的空間要求,而堆排序只需要o(1);幾種簡單演算法的要求均為o(1)

③從穩定性分析:歸併排序獨占鰲頭;簡單演算法中冒泡以及直接插入排序也屬於穩定演算法

④從待排序列數量分析:待排序的個數n越小,採用簡單演算法越合適;反之,n越大,採用改進的排序演算法越合適

氣泡排序 大話資料結構

用於要排序陣列個數最大值,可修改 define maxsize 10 typedef struct sqlist 交換l中陣列r的下標為i和j的值 void swap sqlist l,i,j 氣泡排序初級版,嚴格說不是標準冒泡,因為不滿足 相鄰兩兩比較 但是最簡單的交換排序 思路是每乙個數與它後面...

大話資料結構之堆排序

堆排序思想 將待排序的序列構造成乙個大頂堆。整個序列的最大值就是堆頂的根節點。將它移走 就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新構造成乙個堆,這樣就會得到n個元素中的次大值。如此反覆執行,便能得到乙個有序序列。堆排序的時間複雜度 o nlogn 堆 完全二...

《大話資料結構》之快速排序

include include include define max len 256 typedef struct sqarr void swap sqarr ptoswap,int ifirst,int isecond int output sqarr psqtoprint printf n re...