学习笔记1:冒泡排序, 快速排序
2011-03-25 12:35
267 查看
冒泡排序:
每一次都从数组的最后一位开始两两比较,将值比较小的放前面,值大的放后面。每次都是把轻的气泡往上浮。第一轮比较结束之后,最轻的气泡就到了数组的第一位。接着比较数组的最后一位到数组的第二位,以此类推。
如果有一轮比较过程中,没有发生一次交换,那么说明所有的数都是排好序的。那么可以跳出循环,结束比较。
//Java 代码实现
public class BubbleLeos {
public static void main(String[] args) {
//定义整形数组
int[] data={5,2,9,1,0,11,23,4,55,98,6};
B_Sort(data);
//数组的下标为0到10时, 数组的length值为11,注意数组越界异常。
//打印排序好的数组
for(int k=0;k<data.length;k++){
System.out.print(data[k]+"; ");
}
}
private static void B_Sort(int[] sort){
int len = sort.length;
int i;
//如果数组有11个数的话,那么最多需要比较10轮,i从0~9正好10次。
for(i=0;i<len-1;i++){
//设置布尔变量,如果两两比较过程中没有发生交换,那么isChange的布尔值为false,此时数组已经有序,不需要下一轮的比较。结束循环
Boolean isChange=false;
//从数组尾部开始两两比较,一直比较到第i个
for(int j=len-1;j>i;j--){
//交换,把值小的放前面,大的放后面
if(sort[j]<sort[j-1]){
int temp = sort[j-1];
sort[j-1]=sort[j];
sort[j]=temp;
//发生交换之后,将isChange布尔值设置为trues
isChange=true;
}
}
//如果在某一轮的比较中,没有发生交换,那么说明数组已经有序,结束外层循环。排序完成。
if(!isChange){
break;
}
}
}
}
快速排序
第一步选定一个值作为 中心点(pivot)值;
第二步将 中心点(pivot) 左边的数依次跟 pivot 进行比较,发现比 pivot 大的数就交换位置;
第三步将 中心点(pivot) 右边的数依次跟 pivot 进行比较, 发现比 pivot 小的数就交换位置;
重复第二步和第三步,一直到 中心点 左边的数 都比 中心点右边的数小为止。
此时数据被分为左右两部分,分别对左右两部分数组进行 第一步,第二步,第三步操作;
通过递归调用,最终完成数组的排序。
public class QuickSort {
public static void main(String[] args) {
int[] array={9,1,8,2,7,4,3,6,11,21,33};
qsort_asc(array,0,10);
for(int k=0;k<=array.length-1;k++){
System.out.print(array[k]+";");
}
}
private static void qsort_asc(int data[], int low, int high) {
int i, j, x;
if (low < high) { // 递归结束条件,这步很重要!
i = low;
j = high;
x = data[i];
while (i < j) { //循环比较,这步也很重要!
while (i < j && data[j] > x) {
j--;
}
if (i < j) {
data[i] = data[j];
i++;
}
while (i < j && data[i] < x) {
i++;
}
if (i < j) {
data[j] = data[i];
j--;
}
} // 结束while(i<j)的循环比较
data[i] = x;
qsort_asc(data, low, i - 1);
qsort_asc(data, i + 1, high);
} //结束if (low < high)判断。
}
}
每一次都从数组的最后一位开始两两比较,将值比较小的放前面,值大的放后面。每次都是把轻的气泡往上浮。第一轮比较结束之后,最轻的气泡就到了数组的第一位。接着比较数组的最后一位到数组的第二位,以此类推。
如果有一轮比较过程中,没有发生一次交换,那么说明所有的数都是排好序的。那么可以跳出循环,结束比较。
//Java 代码实现
public class BubbleLeos {
public static void main(String[] args) {
//定义整形数组
int[] data={5,2,9,1,0,11,23,4,55,98,6};
B_Sort(data);
//数组的下标为0到10时, 数组的length值为11,注意数组越界异常。
//打印排序好的数组
for(int k=0;k<data.length;k++){
System.out.print(data[k]+"; ");
}
}
private static void B_Sort(int[] sort){
int len = sort.length;
int i;
//如果数组有11个数的话,那么最多需要比较10轮,i从0~9正好10次。
for(i=0;i<len-1;i++){
//设置布尔变量,如果两两比较过程中没有发生交换,那么isChange的布尔值为false,此时数组已经有序,不需要下一轮的比较。结束循环
Boolean isChange=false;
//从数组尾部开始两两比较,一直比较到第i个
for(int j=len-1;j>i;j--){
//交换,把值小的放前面,大的放后面
if(sort[j]<sort[j-1]){
int temp = sort[j-1];
sort[j-1]=sort[j];
sort[j]=temp;
//发生交换之后,将isChange布尔值设置为trues
isChange=true;
}
}
//如果在某一轮的比较中,没有发生交换,那么说明数组已经有序,结束外层循环。排序完成。
if(!isChange){
break;
}
}
}
}
快速排序
第一步选定一个值作为 中心点(pivot)值;
第二步将 中心点(pivot) 左边的数依次跟 pivot 进行比较,发现比 pivot 大的数就交换位置;
第三步将 中心点(pivot) 右边的数依次跟 pivot 进行比较, 发现比 pivot 小的数就交换位置;
重复第二步和第三步,一直到 中心点 左边的数 都比 中心点右边的数小为止。
此时数据被分为左右两部分,分别对左右两部分数组进行 第一步,第二步,第三步操作;
通过递归调用,最终完成数组的排序。
public class QuickSort {
public static void main(String[] args) {
int[] array={9,1,8,2,7,4,3,6,11,21,33};
qsort_asc(array,0,10);
for(int k=0;k<=array.length-1;k++){
System.out.print(array[k]+";");
}
}
private static void qsort_asc(int data[], int low, int high) {
int i, j, x;
if (low < high) { // 递归结束条件,这步很重要!
i = low;
j = high;
x = data[i];
while (i < j) { //循环比较,这步也很重要!
while (i < j && data[j] > x) {
j--;
}
if (i < j) {
data[i] = data[j];
i++;
}
while (i < j && data[i] < x) {
i++;
}
if (i < j) {
data[j] = data[i];
j--;
}
} // 结束while(i<j)的循环比较
data[i] = x;
qsort_asc(data, low, i - 1);
qsort_asc(data, i + 1, high);
} //结束if (low < high)判断。
}
}
相关文章推荐
- Java 数组排序( 4000 冒泡和选择排序) 学习笔记
- python学习笔记之冒泡、堆、快速排序比较
- C语言学习笔记 -冒泡排序
- 【算法学习笔记】03.白书练习题stat(排序入门:冒泡,桶)
- 黑马程序员-C#冒泡排序-学习笔记
- 【算法学习笔记】03.白书练习题stat(排序入门:冒泡,桶)
- 数据结构学习笔记 --- 排序(冒泡排序、快速排序)
- 数据结构学习笔记排序 (冒泡、插入、希尔、堆排序、归并排序)
- 数据结构 学习笔记(十):排序(上):简单排序(冒泡,插入),希尔 / 选择 / 堆 / 归并 排序
- 数据结构学习笔记 --- 排序(冒泡排序、快速排序)
- 算法导论学习笔记(一)排序算法之快速排序
- PHP冒泡函数排序学习笔记
- 数据结构学习笔记23 快速排序和基尔排序
- 学习笔记:冒泡排序、插入排序、选择排序、快速排序的实现
- 算法-排序-交换排序(冒泡和快速排序)
- 数组排序(学习笔记)
- 排序(冒泡、直接插入、快速排序)
- 学习笔记--- 比较排序之堆排序
- 学习笔记---二叉树排序,面试经常考的题目
- c++学习笔记:直接排序