(2)排序概述

2021-07-23 05:28:08 字數 1715 閱讀 3075

p263

排序(sorting)是計算機程式設計中的一種重要操作,它的功能是將乙個資料元素(或記錄)的任意序列,重新排列成乙個按關鍵字有序的序列。

假設含n個記錄的序列為:,其相應的關鍵字序列為:,需確定1, 2, … , n的一種排列p1, p2, … , pn,使其相應的關鍵字滿足如下的非遞減(或非遞增)關係:kp1 <= kp2 <= … <= kpn,使序列成為乙個按關鍵字有序的序列:。這樣一種操作稱為排序。

上述排序定義中的關鍵字ki可以是記錄ri(i = 1, 2, … , n)的主關鍵字,也可以是ri的次關鍵字,甚至是若干資料項的組合。考慮到待排序序列中可能存在兩個或兩個以上關鍵字相等的記錄,假設ki = kj (1 <= i <= n, 1 <= j <= n, i != j),且在排序前的序列中ri領先於rj(即i < j)。若在排序後的序列中ri仍領先於rj,則稱所用的排序方法是穩定的;反之,若可能使排序後的序列中rj領先於ri,則稱所用的排序方法是不穩定的。

穩定排序是指,在排序過程中如果遇到兩個元素相等,則它們不交換順序。例如,1, 2, 2, 4, 3,在執行排序時第2個元素和第3個元素相等,但它們不交換順序。不穩定排序,就是交換順序,不管是否相同。穩定排序有:氣泡排序、插入排序、歸併排序、基數排序。不穩定排序有:選擇排序、快速排序、希爾排序(shell)、堆排序。

由於待排序的記錄數量不同,使得排序過程中涉及的儲存器不同,可將排序方法分為兩大類:一類是內部排序,指的是待排序記錄存放在計算機隨機儲存器中進行的排序過程;另一類是外部排序,指的是待排序記錄的數量很大,以致記憶體一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程。暫時集中討論內部排序。

內部排序的方法很多,每一種方法都有各自的優缺點,適合在不同的環境(如記錄的初始排列狀態等)下使用。如果按排序過程中依據的不同原則對內部排序方法時行分類,則大致可分為插入排序、交換排序、選擇排序、歸併排序和基數排序。如果按內部排序過程中所需的工作量來區分,則可分為3類:(1)簡單的排序方法,其時間複雜度為o(n^2);(2)先進的排序方法,其時間複雜度為o(nlogn);(3)基數排序,其時間複雜度為o(d·n)。

通常在排序過程中,需要進行兩種基本操作:(1)比較兩個關鍵字的大小;(2)將記錄從乙個位置移動至另乙個位置。前乙個操作對大多數排序方法來說都是必要的,而後乙個操作可以通過改變記錄的儲存方式來予以避免。待排序的記錄序列可有下列3種儲存方式:(1)存放在位址連續的一組儲存單元上。它類似於線性表的順序儲存結構。在這種儲存方式中,記錄之間的次序關係由其儲存位置決定,則實現排序必須借助移動記錄;(2)一組待排序記錄存放在靜態鍊錶中,記錄之間的次序關係由指標指示,則實現排序不需要移動記錄,僅需修改指標既可;(3)待排序記錄本身儲存在一組位址連續的儲存單元內,同時另設乙個指示各個記錄儲存位置的位址向量,在排序過程中不移動記錄本身,而移動位址向量中這些的「位址」,在排序結束之後,再按照位址向量中的值調整記錄的儲存位置。假設待排序記錄的資料型別設為:

#include 

using

std::string;

#define maxsize 20

typedef

int keytype;

typedef

struct

redtype;

typedef

struct

sqlist;

排序通常都會想到第三方的排序函式,但如果不允許用第三方的庫呢?或者第三方的庫太龐大了,我們只需要乙個簡單的排序即可,沒有那麼複雜。於是這些排序的演算法,在我們普通的開發過程中得到了很好的實用機會。

2 排序演算法 快速排序

問題描述 利用快速排序演算法對下列例項排序,在演算法執行過程中,寫出陣列 a第一次排序後被分割的過程。a 65,70,75,80,85,55,50,2 解題思想 在快速排序中,記錄的比較和交換是從兩端向中間進行的,關鍵字較大的記錄一次就能交換到後面的單元,總的比較和移動次數較少。對於輸入的陣列a p...

2 排序演算法 氣泡排序

氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。作為最簡單...

09 排序1 排序

09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...