日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【C++】【十二】排序实现及思路

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】【十二】排序实现及思路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

掌握核心知識點(diǎn):

1.插入排序在一下2種情況效率較高:1)數(shù)據(jù)基本有序? 2)數(shù)據(jù)序列較少?

希爾排序是在插入排序的基礎(chǔ)上的改進(jìn)。

2.快速排序

3.歸并排序

4.堆排序:數(shù)據(jù)初始化為數(shù)據(jù),根據(jù)完全二叉樹,初始化并且調(diào)整堆的順序

//冒泡排序
#include <iostream>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<sys/timeb.h>#define MAX 10long GetSysTime() {struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;
}void Swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}void PrintArray(int arr[],int length) {for (int i = 0; i < length; ++i) {printf("%d ", arr[i]);}printf("\n");
}
//原始冒泡排序
void BubbleSort(int arr[], int length) {for (int i = 0; i < length; ++i) {for (int j = length-1; j > i; j--) {if (arr[j-1] < arr[j]) {//降序Swap(&arr[j-1],&arr[j]);}}}
}void BubbleSortImprovement(int arr[], int length) {int flag = 0;//表示 未排序for (int i = 0; i < length&&flag==0; ++i) {flag = 1;//認(rèn)為未排序好for (int j = length - 1; j > i; j--) {if (arr[j - 1] < arr[j]) {//降序flag = 0;Swap(&arr[j - 1], &arr[j]);}}}
}
//選擇排序
void SeleteSort(int arr[], int length) {for (int i = 0; i < length; ++i) {int min = i;for (int j = i+1; j < length; ++j) {if (arr[j] < arr[min]) {min = j;}}if (min != i) {Swap(&arr[i], &arr[min]);}}
}
//插入排序  1.將無序序列,插入到有序序列中   什么情況下,效果高:
//1)序列基本有序的情況下,插入效率高;
//2)插入排序時,元素序列比較少的情況下
void InsertSort(int arr[], int length) {int i, j, temp;for (i = 1; i < length;++i) {//升序if (arr[i] < arr[i - 1]) {temp = arr[i];for (j = i - 1; j >= 0 && temp < arr[j]; --j) {arr[j + 1] = arr[j];}arr[j + 1] = temp;}}
}
//分組插入排序
//對每一組分別進(jìn)行插入排序
//increment=length increment=increment/3+1
void ShellSort(int arr[], int length) {//從小到大  rename 減少增量排序int increasement = length;do {int i, j, k;increasement = increasement / 3 + 1;for ( i = 0; i < increasement; ++i) {            for (j = i + increasement; j < length; j+=increasement) {if (arr[j] < arr[j - increasement]) {int temp = arr[j];for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement) {arr[k + increasement] = arr[k];}arr[k + increasement] = temp;}}}} while (increasement > 1);
}
//分治法(大問題分成小問題,解決小問題,從而解決大問題)+ 挖坑填數(shù)
void QuickSort(int arr[],int start,int end) {//從小到大int i = start;int j = end;int temp = arr[start];//基準(zhǔn)數(shù)if (i < j) {while (i<j){//從右向左找比基準(zhǔn)數(shù)小while (i < j && arr[j] >= temp) {j--;}if (i < j) { //填坑arr[i] = arr[j];i++;}//從左向右找比基準(zhǔn)數(shù)大的數(shù)while (i < j && arr[i] < temp) {i++;} if (i < j) { //填坑arr[j] = arr[i];j--;}}//把基準(zhǔn)數(shù)放到 i,j位置arr[i] = temp;//對基準(zhǔn)數(shù)左半部分快速排序QuickSort(arr, start, i - 1);//右半部分QuickSort(arr, i + 1, end);}
}//歸并排序:思想:將2個有序序列合并成一個有序序列int* CreatArray() {int* arr = (int*)malloc(sizeof(int)*MAX);srand((unsigned int)time(NULL));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];j_start++;length++;}} //i 序列while (i_start <= i_end) {temp[length] = arr[i_start];i_start++;length++;}while (j_start <= j_end) {temp[length] = arr[j_start];j_start++;length++;}//輔助空間數(shù)組,覆蓋到原空間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);
}//堆排序 任意節(jié)點(diǎn)(非葉子節(jié)點(diǎn)):大頂堆從小大
// 給出一個數(shù)組 相當(dāng)于給出一個完全二叉樹 啊hi不滿足堆的條件,通過調(diào)整堆
// 初始化堆,從下往上i=len/2,i--;
//待調(diào)整數(shù)組,待調(diào)整系欸但下表  待調(diào)整數(shù)組長度void myswap(int arr[], int a, int b) {int temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}
void HeapAdjust(int arr[], int index, int len) {int max = index;int lchild = index * 2 + 1;int rchild = index * 2 + 2;if (lchild<len && arr[lchild]>arr[max]) {max = lchild;}if (rchild<len && arr[rchild]>arr[max]) {max = rchild;}if (max != index) {myswap(arr, max, index);HeapAdjust(arr, max, len);}}void HeapSort(int arr[], int length) {//初始化堆 for (int i = length / 2 - 1; i >= 0; i--) {HeapAdjust(arr, i, length);}//交換堆頂元素for (int i = length - 1; i >= 0; i--) {myswap(arr, 0, i);HeapAdjust(arr, 0, i);}
}int main(void) 
{int arr[MAX];int arr2[MAX];srand((unsigned int)time(NULL));for (int i = 0; i < MAX; ++i) {arr[i] = rand() % MAX;arr2[i]= rand() % MAX;}//PrintArray(arr, MAX);//printf("-------insertt-------\n");//long t_start = GetSysTime();//InsertSort(arr, MAX);//long t_end = GetSysTime();//printf("%d,%d\n", MAX, t_end-t_start);//PrintArray(arr, MAX);//printf("---------shell------\n");//long t_shell_start = GetSysTime();//ShellSort(arr2, MAX);//long t_shell_end = GetSysTime();//printf("%d,%d\n", MAX, t_shell_end - t_shell_start);printf("-------quick--------\n");PrintArray(arr, MAX);//long t_quick_start = GetSysTime();//QuickSort(arr, 0, MAX - 1);//long t_quick_end = GetSysTime();//printf("%d,%d\n", MAX, t_quick_end - t_quick_start);PrintArray(arr, MAX);//printf("----merge----\n");PrintArray(arr, MAX);//long t_merge_start = GetSysTime();//int* temp = (int*)malloc(sizeof(int));//MergeSort(arr2, 0, MAX-1, temp);//long t_merge_end = GetSysTime();//printf("%d,%d\n", MAX, t_merge_end - t_merge_start);PrintArray(arr, MAX);//free(temp);printf("--------heap--------\n");HeapSort(arr, MAX);PrintArray(arr, MAX);printf("-------------------------\n");system("pause");return 0;
}

?

總結(jié)

以上是生活随笔為你收集整理的【C++】【十二】排序实现及思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。