資料結構排序演算法
排序:排序即排列順序,把一組資料排列成有序的資料,或者把一組資料按照關鍵字排成有序的
排序的分類:
(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 平均時間複...