當前位置:
首頁 >
数据结构排序2-希尔,快速,归并排序
發布時間:2025/3/15
26
豆豆
生活随笔
收集整理的這篇文章主要介紹了
数据结构排序2-希尔,快速,归并排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
希爾排序
希爾排序是對插入排序的改進。增加了分組
分組插入排序 降低元素個數,然后對每組分別進行插入排序
利用分組增量遍歷,因為最后必須全部排序一次,然后分別對每組插入排序。把每組的第一個數作為有序序列,
要比較的第一個基準數就是第二個
運行結果:
快速排序
分治法加挖坑填數
找一個基準,小于放左邊,大于放右邊。一直遍歷。填坑。
一般將第一數作為基準數。第一個數下標為i.挖坑。最后一個下標為j,從右邊找一個數填坑。找到小于基準數的然后填坑。則此時j的位置就是坑了,此時從左往右找比基準數大的然后填坑。。。。此時i的地方為坑,繼續一直循環下去,直到i==j時,把基準數填i位置的坑。然后此時i的位置是正確的,然后將i的左邊和右邊分別進行相同的操作。所以用到了遞歸i<j就是遞歸結束條件>
結果:
歸并排序
分組,然后排序,然后存到數組,然后覆蓋原來
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<random> #include<time.h> #include<sys/timeb.h> using namespace std; #define MAX 50000long getSystemTime() {struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm; //毫秒 }void printArr(int arr[], int length) {for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n"); }int* CreateArr() {srand((unsigned int)time(NULL)); //種子int* arr =(int *)malloc(sizeof(int)*MAX);for (int i = 0; i < MAX; i++){arr[i] = rand() % MAX;}return arr; } //合并算法 從小到大 void merge(int arr[], int start, int end, int mid, int *temp) {int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;//表示輔助空間有多少個元素int length = 0;//合并兩個有序序列while (i_start <= i_end && j_start <= j_end){if (arr[i_start] < arr[j_start]){temp[length] = arr[i_start];length++;i_start++;}else{temp[length] = arr[j_start];length++;j_start++;}}//i這個序列while (i_start <= i_end){temp[length] = arr[i_start];length++;i_start++;}//j這個序列while (j_start <= j_end){temp[length] = arr[j_start];length++;j_start++;}//將輔助空間數據覆蓋原空間for (int i = 0; i < length; i++){arr[start+i]=temp[i];} }//歸并排序,將兩個有序序列合并成一個有序序列 不會寫 void mergeSort(int arr[], int start,int end,int *temp) {if (start >= end){return;}int mid = (start + end) / 2;//左半邊mergeSort(arr, start, mid, temp);//右半邊mergeSort(arr, mid+1, end, temp);//合并merge(arr, start, end, mid, temp);}int main() {int *arr = CreateArr();long t_start = getSystemTime();//申請輔助空間int* temp = (int *)malloc(sizeof(int)*MAX);mergeSort(arr, 0, MAX - 1,temp);long t_end = getSystemTime();printf("歸并排序%d個元素,所需時間:%1d\n", MAX, t_end - t_start);/*free(temp);free(arr);*/system("pause");return 0; }運行結果:
歸并排序示意圖:
思路:
因為題目要求復雜度為O(nlogn),故可以考慮歸并排序的思想。
歸并排序的一般步驟為:
1)將待排序數組(鏈表)取中點并一分為二;
2)遞歸地對左半部分進行歸并排序;
3)遞歸地對右半部分進行歸并排序;
4)將兩個半部分進行合并(merge),得到結果。
參考自https://blog.csdn.net/boguesfei/article/details/80413365
?
總結
以上是生活随笔為你收集整理的数据结构排序2-希尔,快速,归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++基础01-C++对c的增强
- 下一篇: 解决$ is not define