快速排序,选择排序,冒泡排序
2018-03-29 15:06
211 查看
一。快速排序从数列中选取一个数作为基数用于比较,记为cardinal
将大于cardinal的数全部放在右边,将小于cardinal的数全部放在左边,进行分区
再对左右两边的分区重复进行第二步,直到分区只有一个数
快速排序是基于分治策略的,分治策略常用的解决方法就是二分法,递归解决
上面用图走了一遍第一次快速排序,这种方法是左右交换的办法比较实用,还有挖坑填值法,可以自去看看,下面是java代码的实现public static void quickSort2(int[] num,int left,int right){
if(left<right){
int port = num[left];
int L = left+1;
int R = right;
while(L<=R){
/*从右边找比基数小的数*/
while(L<=R && num[R]>port)R--;
/*左边开始找 比基数大的值*/
while(L<=R && num[L]<=port)L++;
/*当找到两个符合条件的数,交换两个数*/
if(L<R){
int temp = num[L];
num[L] = num[R];
num[R] = temp;
/*越过这两个数,以为已经比较替换了*/
L++;
R--;
}
}
/*当找不到同时符合两个条件的数的时候,把此时右边的数和基数替换*/
int temp = num[R];
num[R] = port;
num[left] = temp;
/*递归排序左边和右边的*/
quickSort2(num,R+1,right);
quickSort2(num,left,R-1);
}
}二。冒泡排序
冒泡排序:如果升序,左边第一个数和剩余的数比较一发现有比自己小的马上交换,依次执行
将大于cardinal的数全部放在右边,将小于cardinal的数全部放在左边,进行分区
再对左右两边的分区重复进行第二步,直到分区只有一个数
快速排序是基于分治策略的,分治策略常用的解决方法就是二分法,递归解决
上面用图走了一遍第一次快速排序,这种方法是左右交换的办法比较实用,还有挖坑填值法,可以自去看看,下面是java代码的实现public static void quickSort2(int[] num,int left,int right){
if(left<right){
int port = num[left];
int L = left+1;
int R = right;
while(L<=R){
/*从右边找比基数小的数*/
while(L<=R && num[R]>port)R--;
/*左边开始找 比基数大的值*/
while(L<=R && num[L]<=port)L++;
/*当找到两个符合条件的数,交换两个数*/
if(L<R){
int temp = num[L];
num[L] = num[R];
num[R] = temp;
/*越过这两个数,以为已经比较替换了*/
L++;
R--;
}
}
/*当找不到同时符合两个条件的数的时候,把此时右边的数和基数替换*/
int temp = num[R];
num[R] = port;
num[left] = temp;
/*递归排序左边和右边的*/
quickSort2(num,R+1,right);
quickSort2(num,left,R-1);
}
}二。冒泡排序
冒泡排序:如果升序,左边第一个数和剩余的数比较一发现有比自己小的马上交换,依次执行
/** * 冒泡排序 * 每一次找出剩下最大的放在后面 *时间复杂度为O(n^2) */ for(int i=num.length-1; i>=0; i--){ for(int j=i-1; j>=0 ; j-- ){ /*找到比自己大的马上交换*/ if(num[i]<num[j]){ int temp = num[i]; num[i] = num[j]; 4000 num[j] = temp; } } }2.选择排序,相当于冒泡的修改一点,每次找出最大或者最小的数再交换。
for(int i=num.length-1; i>=0; i--){ int max = i; for(int j=i-1; j>=0 ; j-- ){ /*发现有比自己大的数,记录小这个数的位置*/ if(num[max]<num[j]){ max = j; } } /*一轮下来发现最大的数不是自己,就交换位置*/ if(i != max){ int temp = num[i]; num[i] = num[max]; num[max] = temp; } }
相关文章推荐
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- 选择排序、冒泡排序、插入排序、基数排序、快速排序、归并排序完整C++实现
- C#实现所有经典排序算法(选择排序,冒泡排序,快速排序,插入排序,希尔排序)
- 3种排序算法的可视化 冒泡排序 选择排序 快速排序 转自自己另一个帐号
- JAVA最常用的排序_冒泡排序、选择排序、快速排序
- 各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序
- Java 冒泡排序、选择排序、快速排序、归并排序
- 排序算法解析--冒泡排序,选择排序,快速排序
- 插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序算法比较
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序
- PHP -快速排序 -选择排序 -冒泡排序
- C语言 冒泡排序 快速排序 直接插入排序 选择排序
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
- 排序方法整理Java - 冒泡排序、选择排序、插入排序、快速排序
- 插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序
- java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)
- C++ ------------排序算法(冒泡排序-快速排序-选择排序-插入排序-希尔排序)
- Java 排序 快速排序 冒泡排序 选择排序 插入排序