冒泡、选择、插入、快排;C/C++实现

来源:互联网 发布:fopen提高权限 linux 编辑:程序博客网 时间:2024/06/05 04:13

冒泡、选择、插入、快排 排序算法

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 快速排序


冒泡排序

  • 排序结果放前面;如下图:
    这里写图片描述

  • 代码:

int maopao(int arr[], int len){  if(NULL == arr || len < 2)  {    return -1;  }  for(int i = 0; i < len - 1; ++i)  {    for(int j = i+1; j < len; ++j)    {      if(arr[i] > arr[j])      {        int tmp = arr[i];        arr[i] = arr[j];        arr[j] = tmp;      }    }  }  return 0;}int main(){  int arr[] = {3,5,1,4,2};  int len = sizeof(arr)/sizeof(arr[0]);  maopao(arr, len);  for(int i = 0; i < len; ++i)  {    printf("%d ", arr[i]);  }  return 0;}
  • 测试结果:
    这里写图片描述

  • 排序结果放后面;如下图:
    这里写图片描述

  • 代码:

int maopao(int arr[], int len){  if(NULL == arr || len < 2)  {    return  -1;  }  for(int j = 0; j < len - 1; ++j)  {    for(int  i = 0; i < len - 1 - j; ++i)    {      if(arr[i] > arr[i+1])      {        int tmp = arr[i];        arr[i] = arr[i+1];        arr[i+1] = tmp;      }    }  }  return 0;}int main(){  int arr[] = {3,5,1,4,2};  int len = sizeof(arr)/sizeof(arr[0]);  maopao(arr, len);  for(int i = 0; i < len; ++i)  {    printf("%d ", arr[i]);  }  return 0;}
  • 测试结果:
    这里写图片描述


选择排序

  • 内循环找到最小值下标;根据判断最小值下标确定是否需要交换当前最小值;如下图:
     这里写图片描述
  • 代码:
int xuanzhe(int arr[], int len){  if(NULL == arr || len < 2)  {    return -1;  }  for(int j = 0; j < len - 1; ++j)  {    int min = j;    for(int i = j + 1; i < len; ++i)    {      if(arr[min] > arr[i]) //找到后面元素最小值的下标      {        min = i;      }    }    if(j != min)  //说明需要交换    {      int tmp = arr[j];      arr[j] = arr[min];      arr[min] = tmp;    }  }  return 0;}
  • 测试结果:
    这里写图片描述


插入排序

  • 从后面取一个数字和前面有序序列进行比较,找到插入点插入到前面有序序列中;如下图:
    这里写图片描述

  • 代码:

int charu(int arr[], int len){  if(NULL == arr || len < 2)  {    return -1;  }  int j = 0;  for(int i = 1; i < len; ++i)  {    int tmp = arr[i]; //缓存当前要和前面有序序列比较的值    for( j = i - 1; j >=0 && tmp < arr[j]; --j)    {      arr[j+1] = arr[j];  //移动数据,寻找插入点    }    arr[j+1] = tmp;   //因为上面循环退出时--j;所以插入点位置为j+1  }  return 0;}
  • 测试结果:
    这里写图片描述


快速排序

  • 有点二分查找的思想;选取一个基数BaseNum(作为比较值),一般选取数组中的首元素作为基数;定义左右两个数组下标值,left、right;先从right往前依次比较找到比基数小的值停下来,再从left往后依次比较找到比基数大的值(一个从后往前遍历,一个从前往后遍历);如果left != right (没有重合)说明需要交换当前左、右下标的元素值;否则需将当前基数值BaseNum和重合点下标的元素进行交换。然后以当前重合点为分割线,分成两个序列;分别对两个序列重复以上步骤;最终得到排序结果。(这里以升序为例)如下图:
    这里写图片描述

  • 代码:

int kuaisu(int arr[], int left, int right){  //传参合法性判断  if(NULL == arr || left < 0 || right < 0)  {    return -1;  }  if(left > right)  //递归退出条件  {    return 0;  }  int i = left;  int j = right;  int BaseNum = arr[left];  //基数  while(i != j)  {    while(arr[j] >= BaseNum && i < j)   //先从右边找比BaseNum小的元素      --j;    while(arr[i] <= BaseNum && i < j)   //再从左边找比BaseNum大的元素      ++i;    //交换;把比基数BaseNum大元素都放在右边,比基数小的放在左边    int tmp = arr[i];    arr[i] = arr[j];    arr[j] = tmp;  }  //将基数值归位  arr[left] = arr[i];  arr[i] = BaseNum;  //递归分别对左边序列和右边序列进行排序  kuaisu(arr, left, i-1);  kuaisu(arr, i+1, right);  return 0;}
  • 测试结果:
    这里写图片描述



如有问题,欢迎提出建议和修改。

阅读全文
0 0