數據結構(五)
- 常見的排序算法
- 內部排序
- 交換
- 插入
- 選擇
- 歸并
- 基數
- 外部排序
- 基于歸并的
常見的排序算法
內部排序
交換
冒泡:每一次運行總會將最小的或者最大的放到前面,如果需要交換,一直在交換
快速排序*:經過一次快排的過程,將待排序元素分成兩部分:比基準小的,比基準大的,再分別對這兩部分進行快
速排序
#include <stdio.h>
//快排操作,將數組分成兩部分
int Quick_Pass(int arr[], int low, int high)
{int key = arr[low]; //找基準//從上往下依次比較while(low < high){while(low < high && arr[high] > key){//往前走high--;}//把后面遇到的比key小的值放入到前面arr[low] = arr[high];while(low < high && arr[low] <= key){//往后走low++;}//將前面的比key大的值放入盜后面arr[high] = arr[low];}//比較完了,low == high//基準入隊arr[low] = key;return low;
}
//快速排序
void Quick_Sort(int arr[], int low, int high)
{if(low >= high) return ;//執行一次快排操作int mid = Quick_Pass(arr, low, high);//左便Quick_Sort(arr, low, mid-1);//右邊Quick_Sort(arr, mid+1, high);
}
int main(int argc, const char *argv[])
{int arr[13] = {55, 22, 34, 12, 99, 76, 38, 65, 29, 35, 11, 36, 74};printf("排序前:");for(int i=0; i<13; i++){printf("%d ", arr[i]);}printf("\n");//排序Quick_Sort(arr, 0, 12);printf("排序后:");for(int i=0; i<13; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
插入
直接插入:重構鏈表
折半插入:原理同排序二叉樹的插入,只是對象是一個有序的順序表
希爾排序:增量,逐漸減少的,直到增量為1為止
選擇
簡單選擇:每一次運行總會將最小的或者最大的放到前面,如果需要交換,只交換一次
堆(大根堆,小根堆):根結點的值>=左右孩子的值 根節點的值<=左右孩子的值
在Linux下,系統定時器使用小根堆來管理定時器事件。小根堆是一種數據結構,可以快速找到最小值。
歸并
當然可以。下面是一個使用C語言編寫的簡單歸并排序算法示例。歸并排序是一種分治算法,它的核心思想是將一個
大問題分解成多個小問題,然后遞歸地解決這些小問題,最后將結果合并起來。
#include <stdio.h>
void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];for (int i = 0; i < n1; i++)L[i] = arr[left + i];for (int j = 0; j < n2; j++)R[j] = arr[mid + 1 + j];int i = 0;int j = 0;int k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}
}
void merge_sort(int arr[], int left, int right) {if (left >= right)return;int mid = left + (right - left) / 2;merge_sort(arr, left, mid);merge_sort(arr, mid + 1, right);merge(arr, left, mid, right);
}