排序
作者:互联网
选择排序算法
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("\n//===========================\n"); 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\n", binarySeaarch(ar, 0, 9, 10)); 38 merge_sort(arr7, LEN); 39 printArr(arr7, LEN); 40 cin.get(); 41 return 0; 42 }
标签:10,arr,int,len,LEN,tempVal,排序 来源: https://www.cnblogs.com/liugangjiayou/p/11442758.html