• 排序


    1. //选择排序  
    2. void SelectSort(int *array, int size)  
    3. {  
    4.     for (int idx = 0; idx < size; ++idx)  
    5.     {  
    6.         int min = idx ;//假定第一个元素最小  
    7.         int tmp = idx + 1;//标记第二个元素  
    8.         while (tmp < size)//寻找最小的元素  
    9.         {  
    10.             if (array[tmp] < array[min])  
    11.             {  
    12.                 min = tmp;  
    13.             }  
    14.             tmp++;  
    15.         }  
    16.         if (idx != min)  
    17.         {  
    18.             std::swap(array[min], array[idx]);  
    19.         }  
    20.     }  
    21. }  
    22.   
    23. //冒泡排序  
    24. void BubbleSort(int* array, int size)  
    25. {  
    26.     int flag = 1;  
    27.     int  count = 0;  
    28.     for (int idx = 0; idx < size - 1; ++idx)//控制数据向后遍历  
    29.     {  
    30.         for (int jx = 0; jx < size - idx - 1; ++jx)//两个数进行比较  
    31.         {  
    32.             if (array[jx]>array[jx + 1])  
    33.             {  
    34.                 std::swap(array[jx], array[jx + 1]);  
    35.                 flag = 0;  
    36.             }  
    37.             count++;//标记比较次数  
    38.         }  
    39.         if (flag == 1)//有序的不进行比较  
    40.         {  
    41.             break;  
    42.         }  
    43.     }  
    44. }  
    45.   
    46. //递归归并排序  
    47. void Merge(int *array, int *temp,int left, int mid, int right)//归并  
    48. {  
    49.     int begin1 = left;//标记最左边的节点  
    50.     int end1 = mid;//标记中间的节点  
    51.     int begin2 = mid+1;//   
    52.     int end2 = right;  
    53.     int index = left;  
    54.     while (begin1 <= end1 && begin2 <= end2)  
    55.     {  
    56.         if (array[begin1] < array[begin2])  
    57.         {  
    58.             temp[index++] = array[begin1++];  
    59.         }  
    60.         else  
    61.         {  
    62.             temp[index++] = array[begin2++];  
    63.         }  
    64.     }  
    65.     while (begin1 <= end1)  
    66.     {  
    67.         temp[index++] = array[begin1++];  
    68.     }  
    69.     while (begin2 <= end2)  
    70.     {  
    71.         temp[index++] = array[begin2++];  
    72.     }  
    73. }  
    74. void _MergeSort(int *array,int *temp, int left, int right)  
    75. {  
    76.     if (left < right)  
    77.     {  
    78.         int mid = left + ((right - left) >> 1);  
    79.         _MergeSort(array, temp, left, mid);  
    80.         _MergeSort(array,temp, mid + 1, right);  
    81.         Merge(array, temp,left, mid, right);  
    82.         memcpy(array + left, temp + left, sizeof(array[0])*(right - left + 1));  
    83.     }  
    84. }  
    85. void MergeSort(int *array, int size)  
    86. {  
    87.     int *temp = new int [size];  
    88.     if (NULL != temp)  
    89.     {  
    90.         _MergeSort(array, temp, 0, size - 1);  
    91.         delete[]temp;  
    92.     }  
    93. }  
    94.   
    95. //非递归归并排序  
    96. void MergeSortNor(int *array, int size)  
    97. {  
    98.     int* temp = new int[size];  
    99.     int left = 0;  
    100.     int right = size - 1;  
    101.     int gap = 1;  
    102.     while (gap < size)  
    103.     {  
    104.         for (size_t idx = 0; idx < size; idx += 2 * gap)  
    105.         {  
    106.             left = idx;  
    107.             int mid = idx + gap - 1;  
    108.             right = mid + gap;  
    109.             if (mid >= size)  
    110.             {  
    111.                 mid  = size - 1;  
    112.             }  
    113.             if (right >= size)  
    114.             {  
    115.                 right = size - 1;  
    116.             }  
    117.             Merge(array, temp, left, mid, right);//归并  
    118.         }  
    119.         memcpy(array, temp, size*sizeof(int));  
    120.         gap++;  
    121.     }  
    122.     delete[]temp;  
    123. }  
    124.   
    125. //打印排序后的序列  
    126. void printfSort(int arr[], int count)  
    127. {  
    128.     for (int idx = 0; idx < count; ++idx)  
    129.     {  
    130.         cout << arr[idx] << " ";  
    131.     }  
    132.     cout << endl;  
    133. }  
    134. void FuntTest()  
    135. {  
    136.     //int array[] = { 1 };  
    137.     int array[] = { 21, 25, 49, 25, 0, 16 };  
    138.     //int array[] = { 7, 3, 2, 0, 1, 4 };  
    139.     //int array[] = { 2, 3, 5, 7, 9, 0, 1, 6, 4, 8 };  
    140.     int count = sizeof(array) / sizeof(array[0]);  
    141.     cout << count << endl;  
    142.     printfSort(array, count);  
    143.     //BubbleSort(array, count);//ok  
    144.     //SelectSort(array, count);//ok  
    145.     //InsertSort(array, count);  
    146.     //MergeSort(array, count);//递归归并排序  
    147.     //MergeSortNor(array, count);非递归归并排序  
    148.     printfSort(array,count);  
    149. }  
    150. int main()  
    151. {  
    152.     FuntTest();  
    153.     system("pause");  
    154.     return 0;  
  • 相关阅读:
    微信小程序实现运动步数排行(可删除)
    一个文艺的在线生成漂亮的二维码工具网站
    微信小程序常见的UI框架/组件库总结
    小程序踩坑记- tabBar.list[3].selectedIconPath 大小超过 40kb
    推荐一款便捷的在线图片处理工具
    如何在本地运行查看github上的开源项目
    微信小程序实现运动步数排行(可删除)
    从零开始学ios开发(三):第一个有交互的app
    从零开始学ios开发(二):Hello World!来啦!
    从零开始学ios开发(一):准备起航
  • 原文地址:https://www.cnblogs.com/lyugeyi1030/p/8228137.html
Copyright © 2020-2023  润新知