欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 算法学习4

算法学习4

2024/10/26 3:31:19 来源:https://blog.csdn.net/qq_65818377/article/details/142731082  浏览:    关键词:算法学习4

学习目录

  • 一.荷兰国旗
    • 1.问题一
    • 2.问题二(荷兰国旗问题)
  • 二.快排
    • 1.快排版本1
    • 1.快排版本2

一.荷兰国旗

1.问题一

一个数组,选择其中一个数作为对照,把小于等于对照数的放在数组的左边,大于对照数的放在右边;

思路:
设置小于区间,开始位置在数组开头前一位;
下标从数组第一个元素开始判断,有如下两种情况:
  (1)若当前数小于等于对照数,则将当前数与小于区间
      的下一个数进行交换,并将小于区间向前移一位,
      下标移动到下一位;
  (2)若当前数大于对照数,则直接将下标移动到下一
      位;
直到下标超出数组长度,则结束;

2.问题二(荷兰国旗问题)

一个数组,选择其中一个数作为对照,把小于等于对照数的放在数组的左边,等于对照数的将其放在数组中间,大于对照数的放在右边;

思路:
设置小于区间,开始位置在数组开头前一位;
设置大于区间,开始位置在数组结尾后一个;
下标从数组第一个元素开始判断,有如下三种情况:
  (1)若当前数小于对照数,则将当前数与小于区间
      的下一个数进行交换,并将小于区间向前移一位,
      下标移动到下一位;
  (2)若当前数等于对照数,则直接将下标移动到下一
      位;
  (3)若当前数大于对照数,则将大于区间前一位数与当
      前数进行交换,下标不变,大于区间前进一位;
直到下标与大于区间重叠,或者下标超出数组长度,则结束;

二.快排

1.快排版本1

原理:

  1. 选数组最后一个数为对照数;
  2. 对其余元素进行荷兰国旗方法排序;
  3. 将对照数放置在大于区间的前一个位置;
  4. 然后对大于和小于区间进行荷兰国旗方法排序,对照数分别为各自区间的最后一个;
  5. 然后不断重复上面2、3、4操作;



快排的时间复杂度都为O(N2);

1.快排版本2

原理:

  1. 随机选数组中的一个将其与数组的最后一个元素交换并将其当作对照数;
  2. 对其余元素进行荷兰国旗方法排序;
  3. 将对照数放置在大于区间的前一个位置;
  4. 然后对大于和小于区间进行荷兰国旗方法排序,对照数分别从各自区间中选取并将其放置在各自区间的最后一个;
  5. 然后不断重复上面2、3、4操作;



快排的时间复杂度都为O(N * logN);



代码:

public void quickSort(int[] arr,int L,int R)
{if(L < R){//选取随机数当作对照数放置在最后一位swap(arr,L + (int)(Math.random() * (R - L + 1)),R);int[] p = partition(arr,L,R);quickSort(arr,L,p[0] - 1);quickSort(arr,p[1] + 1,R);}	
}//返回等于区域(左边界,右边界)
public int[] partition(int[] arr, int L,int R){//小于区域右边界int less = L - 1;//大于区域左边界int more = R;//L为当前数的位置while(L < more){if(arr[L] < arr[R]){swap(arr,++less,L++);}else if(arr[L] > arr[R]){swap(arr,--more,L);}else{L++;}}swap(arr,more,R);return new int[] {less + 1,more};
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com