資料結構排序演算法

2021-08-07 12:21:34 字數 3562 閱讀 3334

資料結構排序演算法

排序:排序即排列順序,把一組資料排列成有序的資料,或者把一組資料按照關鍵字排成有序的

排序的分類:

(1)按照儲存位置分為:內部排序(即在記憶體中)和外部排序(即記憶體呼叫磁碟)

(2)按照演算法或者邏輯分為:插入排序、選擇排序、交換排序、歸併排序和基數排序

(3)按照排序結果分為:公升序排序和降序排序

時間複雜度:某個事件的執行次數

空間複雜度:臨時儲存位的個數

穩定性:重複資料在排序前後的位置不發生變化為穩定,反之為不穩定

下面將簡要介紹插入排序、選擇排序、交換排序、歸併排序和基數排序等排序演算法

插入排序(直接插入排序和希爾排序)

直接插入排序:

(1)把乙個陣列先劃分成已排序的部分和未排序的部分

(2)從未排序部分獲取乙個關鍵字作為待排序數

(3)在已排序的部分中找到合適的位置插入這個資料

直接插入排序的時間複雜度為 o(n^2), 空間複雜度為 o(1), 該演算法是穩定的排序演算法

直接插入排序**如下:

void insertsort(int arr, int len)

arr[j + 1] = arr[0];

}}

希爾排序:即在直接插入排序的基礎上,增加乙個增量組合

希爾排序的時間複雜度為 o(n^1.3) ~ o(n^1.5), 空間複雜度為 o(1), 該演算法是不穩定的排序演算法

希爾排序的**如下:

void shell(int *arr, int arr_len,int dk)

arr[j + dk] = tmp; }}

void shellsort(int *arr, int arr_len, int *dka, int dka_len)

}

選擇排序(簡單選擇排序和堆排序)簡單選擇排序(以公升序為例):一趟排序中找到最小的數,二趟排序中找到剩下數列中最小的數

簡單選擇排序是一種不穩定的排序演算法

簡單選擇排序的**如下:

void selectsort(int *arr, int len)

} tmp = arr[min];

arr[min] = arr[i];

arr[i] = tmp;

}}

堆排序堆包括大根堆和小根堆

大根堆:父節點的資料大於子節點的資料 ——> 公升序

小根堆:父節點的資料小於子節點的資料 ——> 降序

堆排序的**如下:(以公升序為例)

void heapadjust(int *arr, int i, int len)//堆調整

if (arr[j] < arr[i])break;

arr[0] = arr[i];

arr[i] = arr[j];

arr[j] = arr[0];

i = j; }}

void heapsort(int *arr, int len)//堆排序

for (int j = len; j > 0; j--)

}

交換排序(氣泡排序和快速排序)

氣泡排序**如下:

void bubblesort(int *arr, int len)

} printf("i = %d\n", i);

if (!mark)}}

快速排序(分治法):選乙個基準數,小的資料放在這個數左邊,大的資料放在這個數右邊

快速排序的**如下:

int partition(int *arr, int low, int high)

arr[low] = tmp;

return low;

}void qsort(int *arr, int low, int high)

}void quicksort(int *arr, int len)

歸併排序

(1)分:利用二分法劃分數列成小組

(2)合:小組按照二分法劃分出的小組組合

歸併排序的**如下:

void merge(int *arr, int *tmp, int startindex, int midindex, int endindex)

else

}while (i != midindex + 1)

while (j != endindex + 1)

for (int i = startindex; i <= endindex; i++) }

void mergesort(int *arr, int *tmp, int startindex, int endindex)

}

基數排序(排序趟數為最大值的位數)

基數排序的**如下:

#define n 13

//double pow(double,int);

int findmaxfinger(int *arr, int len)//計算最大值的位數

} int count = 0;

while (max != 0)

return count;

}//每個資料位的數 (45 0) 5 (45 1) 4

//num/pow(10.0,fin)%10

int findfingernumber(int num, int fin)

//0,1,2(個,十,百) 0不能參與排序

void radix(int *arr, int len, int fin)

; int num_fin;

int count;

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

tmp[num_fin][count] = arr[i];

} count = 0;

for (int i = 0; i < 10; i++)

else

} }}

//0可以參與排序

void radix1(int *arr, int len, int fin)

; int num_fin;

int count[10] = {};

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

int index = 0;

for (int i = 0; i < 10; i++) }

}//每趟迴圈呼叫radix()

void radixsort(int *arr, int len)

}

以上演算法的時間複雜度、空間複雜度以及穩定性如下表顯示:

資料結構 排序演算法

include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...

資料結構 排序演算法

排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...

資料結構 排序演算法

直接插入排序是指將r i r n 插入到已經有序的r 1 r i 1 序列中。r 0 是乙個哨兵,起到作為邊界條件並作為暫存單元的作用。實際上,一切為簡化邊界條件而引入的附加節點 元素 均可稱為哨兵。例如單鏈表中的頭結點。對於有n個記錄的集合,要進行n 1趟排序。其最優時間複雜度是o n 平均時間複...