• 排序


    选择排序算法

     1 void select_sort(int arr[], size_t len)
     2 {
     3     for (int i = 0; i < len - 1; i++)
     4     {
     5         for (int j = i + 1; j < len;j++)
     6         {
     7             if (arr[i]>arr[j])
     8             {
     9                 int tempVal = arr[i];
    10                 arr[i] = arr[j];
    11                 arr[j] = tempVal;
    12             }
    13         }
    14     }
    15 }

    冒泡排序算法

     1 void bubble_sort(int arr[], size_t len)
     2 {
     3     for (int i = 0; i < len-1;i++)
     4     {
     5         for (int j = 0; j < len - 1 - i;j++)
     6         {
     7             if (arr[j]>arr[j+1])
     8             {
     9                 int tempVal = arr[j];
    10                 arr[j] = arr[j + 1];
    11                 arr[j + 1] = tempVal;
    12             }
    13         }
    14     }
    15 }

    插入排序算法优化过程

     1 void insert_sort1(int arr[], size_t len)
     2 {
     3     int tempVal;
     4     for (int i = 1; i < len; ++i)//确定插入过程中需要插入元素的下标i
     5     {
     6         for (int j = i - 1; j>=0; j--)//j为已序序列最后一个元素的下标
     7         {
     8             if (arr[j+1] < arr[j])//如果插入的元素和最后一个元素进行判断
     9             {
    10                 tempVal = arr[j + 1];
    11                 arr[j + 1] = arr[j];
    12                 arr[j] = tempVal;
    13             }
    14             else
    15                 break;
    16         }
    17     }
    18 
    19 }
     1 void insert_sort2(int arr[], size_t len)
     2 {
     3     int tempVal,j;
     4     for (int i = 1; i < len;++i)//确定插入过程中需要插入元素的下标i
     5     {
     6         tempVal = arr[i];//保存一下待插入的元素值
     7         for (j = i - 1; j>=0;j--)//j为已序序列最后一个元素的下标
     8         {
     9             if (tempVal<arr[j])//如果插入的元素和最后一个元素进行判断
    10             {
    11                 arr[j + 1] = arr[j];
    12             }
    13             else
    14                 break;
    15         }
    16         arr[j + 1] = tempVal;//把保存的元素放在对应的位置
    17     }
    18 
    19 }
     1 void insert_sort3(int arr[], size_t len)
     2 {
     3     int tempVal, j;
     4     for (int i = 1; i < len; ++i)//确定插入过程中需要插入元素的下标i
     5     {
     6         tempVal = arr[i];//保存一下待插入的元素值
     7         for (j = i - 1; j >= 0 && tempVal < arr[j]; j--)//j为已序序列最后一个元素的下标
     8         {
     9             arr[j + 1] = arr[j];
    10         }
    11         arr[j + 1] = tempVal;//把保存的元素放在对应的位置
    12     }
    13 }
     1 void insert_sort(int arr[], size_t len)
     2 {
     3     int tempVal, j;
     4     for (int i = 1; i < len; ++i)//确定插入过程中需要插入元素的下标i
     5     {
     6         tempVal = arr[i];//保存一下待插入的元素值
     7         j = i - 1;
     8         while( j >= 0 && tempVal < arr[j])//j为已序序列最后一个元素的下标
     9         {
    10             arr[j + 1] = arr[j]; 
    11             j--;
    12         }
    13         arr[j + 1] = tempVal;//把保存的元素放在对应的位置
    14     }
    15 
    16 }

    希尔排序(插入排序的优化)

     1 void shell_sort(int arr[], size_t len)
     2 {
     3     int tempVal, j;
     4     int jump = len >> 1;
     5     while (jump != 0)
     6     {
     7         for (int i = jump; i < len; ++i)//确定插入过程中需要插入元素的下标i
     8         {
     9             tempVal = arr[i];//保存一下待插入的元素值
    10             j = i - jump;
    11             while (j >= 0 && tempVal < arr[j])//j为已序序列最后一个元素的下标
    12             {
    13                 arr[j + 1] = arr[j];
    14                 j-=jump;
    15             }
    16             arr[j + jump] = tempVal;//把保存的元素放在对应的位置
    17         }
    18         jump >>= 1;
    19     }
    20 }

    桶排序(时间最快 空间最大的排序)

     1 void radix_sort(int arr[],size_t len)//桶排序
     2 {
     3     int temp[10][10] = {};
     4     for (int n = 1; n < 1000;n*=10)
     5     {
     6         for (int x = 0; x < 10;x++)
     7         {
     8             for (int y = 0; y < 10;++y)
     9             {
    10                 temp[x][y] = -1;//不一定是-1
    11             }
    12 
    13         }
    14         for (int i = 0; i < len;++i)
    15         {
    16             int tempIndex = (arr[i] / n) % 10;
    17             temp[tempIndex][i] = arr[i];
    18         }
    19         int k = 0;
    20         for (int x = 0; x < 10; x++)
    21         {
    22             for (int y = 0; y < 10; ++y)
    23             {
    24                 if (temp[x][y] != -1)
    25                 {
    26                     arr[k++] = temp[x][y];
    27                 }
    28             }
    29         }
    30 
    31     }
    32 
    33 }

    归并排序(递归 合并)

     1 void _merge_in_arr(int arr[], int left, int mid, int right)//处理合并
     2 {
     3     //准备一个辅助数组
     4     int length = right - left + 1;//表示辅助数组长度
     5     int *pData = new int[length];//分配动态内存 保存数据
     6     //memset内存逐字节赋值 第一个参数是哪个内存 第二个参数赋什么值,第三个参数这个内存需要赋多大内存
     7     memset(pData, 0, sizeof(int)* length);
     8     //合并
     9     int low = left;//定义一个变量接一下左边第一个下标位置
    10     int hig = mid + 1;//定义一个变量接一下右边区域的第一个赋值
    11     int index = 0;//给辅助数组遍历的下标
    12     while (hig<=right&&low<=mid)//左右区间都有数据 都没比较结束
    13     {
    14         while (low <= mid&&arr[low] <= arr[hig])//左边区间没有越界 并且左区间的数值<=右区间的数值
    15         {
    16             pData[index++] = arr[low++];
    17         }
    18         while (hig <= right&&arr[low] > arr[hig])//右边区间没有越界 并且右区间的数值>右区间的数值
    19         {
    20             pData[index++] = arr[hig++];
    21         }
    22     }
    23     //到这一步,证明起码有一个区间是合并进了辅助数组
    24     if (hig<=right)//证明右区间并没有完成合并,左区间是完成合并 把右区间剩下的数据直接拷贝到辅助数组即可
    25         memcpy(&pData[index],&arr[hig],sizeof(int)*(right-hig+1));//内存拷贝有三个参数 表示把第二个参数的首地址拷贝到第一个参数的首地址里面 拷贝大小为第三个参数大小
    26     if (low <= mid)
    27         memcpy(&pData[index], &arr[low], sizeof(int)*(mid - low + 1));
    28     memcpy(&arr[left], pData, sizeof(int)* length);
    29     delete[] pData;
    30 }
    31 void _merge(int arr[], int left, int right)//通过递归把数组拆成两个部分
    32 {
    33     if (left >= right)//当左右下标一致时 区间内只有一个元素 不用再拆分
    34         return;
    35     //int mid = (right - left) >> 1;
    36     int mid = ((right - left) >> 1) + left;
    37     _merge(arr, left, mid);//递归左区间
    38     _merge(arr, mid + 1, right);//递归右区间
    39     //合并操作
    40     _merge_in_arr(arr, left, mid, right);
    41 }
    42 void merge_sort(int arr[], size_t len)
    43 {
    44     _merge(arr, 0, len-1);
    45 }

    快速排序

     1 void quick_sort(int arr[], int low, int hight)
     2 {
     3     int t = arr[low];//确定标杆的值
     4     int f = low + 1;//表示指的数应该比标杆小
     5     int b = hight;//表示指的数应该比标杆大
     6     if (low >= hight)return;//表示只有一个元素 无需定位
     7     int tempVal;
     8     while (f<=b)//表示待定位的区间是存在的
     9     {
    10         while (f<=b)
    11         {
    12             while (f <= b&&arr[f] <= t) f++;//一直找标杆大的元素
    13             while (f <= b&&arr[b] >= t) b--;//一直找比标杆小的元素
    14             if (f<b)//定位区间没有搜索完成
    15             {
    16                 tempVal = arr[f];
    17                 arr[f] = arr[b];
    18                 arr[b] = tempVal;
    19                 f++;
    20                 b--;
    21             }
    22         }
    23         arr[low] = arr[b];
    24         arr[b] = t;
    25         quick_sort(arr, low, b - 1);
    26         quick_sort(arr,b+1,hight);
    27 
    28          
    29     }
    30 }

    二分查找

     1 int binarySeaarch(int arr[], int low, int hight, int findVal)
     2 {
     3     int mid = 0;//表示中间下标
     4     while (low <= hight)//表示区间存在
     5     {
     6         mid = ((hight - low) >> 1) + low;
     7         if (findVal == arr[mid])
     8             return mid;
     9         if (findVal < arr[mid])
    10             hight = mid - 1;
    11         if (findVal > arr[mid])
    12             low = mid + 1;
    13     }
    14     return -1;
    15 }

     输出函数

    1 void printArr(int arr[], int len)
    2 {
    3     for (int i = 0; i < len;++i)
    4     {
    5         printf("%d     ", arr[i]);
    6     }
    7     printf("
    //===========================
    ");
    8 }

    主函数

     1 int main()
     2 {
     3     srand((size_t)time(nullptr));
     4     int arr[LEN];
     5     int arr1[LEN]; 
     6     int arr2[LEN];
     7     int arr3[LEN];
     8     int arr4[LEN];
     9     int arr5[LEN]; 
    10     int arr6[LEN];
    11     int arr7[LEN];
    12     for (int i = 0; i < LEN;i++)
    13     {
    14         arr[i] = rand() % 900+100;
    15         arr1[i] = arr[i];
    16         arr2[i] = arr[i];
    17         arr3[i] = arr[i];
    18         arr4[i] = arr[i];
    19         arr5[i] = arr[i];
    20         arr6[i] = arr[i];
    21         arr7[i] = arr[i]; 
    22     }
    23     printArr(arr, LEN);
    24     select_sort(arr, LEN);
    25     printArr(arr, LEN);
    26     bubble_sort(arr1, LEN);
    27     printArr(arr1, LEN);
    28     insert_sort(arr2, LEN);
    29     printArr(arr2, LEN);
    30     shell_sort(arr3, LEN);
    31     printArr(arr3, LEN);
    32     radix_sort(arr4, LEN);
    33     printArr(arr4, LEN);
    34     insert_sort1(arr5, LEN);
    35     printArr(arr5, LEN);
    36     int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    37     printf("%d
    ", binarySeaarch(ar, 0, 9, 10));
    38     merge_sort(arr7, LEN);
    39     printArr(arr7, LEN);
    40     cin.get();
    41     return 0;
    42 }
  • 相关阅读:
    Struts tags--Data tags
    Java NIO学习笔记七 Non-blocking Server
    Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel
    Java NIO学习笔记五 FileChannel(文件通道)
    Java NIO学习笔记四 NIO选择器
    Java NIO学习笔记 三 散点/收集 和频道转换
    SpringMVC接收集合页面参数
    JAVA NIO学习笔记二 频道和缓冲区
    Java NIO学习笔记一 Java NIO概述
    通过举例了解java中的流
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11442758.html
Copyright © 2020-2023  润新知