`
wangkechao.dream
  • 浏览: 46029 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
352630cf-f670-3416-b946-55dec5cd787c
设计模式
浏览量:30063
社区版块
存档分类
最新评论

2.排序-交换类排序

阅读更多

1. 起泡排序

基本思想

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码如下:

package sort.exchange;


/**
 * 冒泡排序算法
 * 
 * @author king
 *
 */
public class BuddleSort {
	//冒泡
	private static void buddleSort(int[] data){
		int count=1;
		for(int i=0;i<data.length;i++){
			for(int j=1;j<(data.length-i);j++){
				int temp;//定义临时存储的变量
				if(data[j-1]>data[j]){
					//交换两个记录
					temp=data[j];
					data[j]=data[j-1];
					data[j-1]=temp;
				}
			}
			System.out.println("第" + count + "趟排序:");
			for (int k = 0; k < data.length; k++) {
				System.out.print(data[k] + " ");
			}
			System.out.print("\n");
			count++;
		}
	}
	public static void main(String[] args) {
		int[] data= new int[]{10,9,8,7,6,5,4,3,2,1};
		buddleSort(data);
		for (int k = 0; k < data.length; k++) {
			System.out.print(data[k] + " ");
		}
	}
}

运行结果 

第1趟排序:

9 8 7 6 5 4 3 2 1 10 

第2趟排序:

8 7 6 5 4 3 2 1 9 10 

第3趟排序:

7 6 5 4 3 2 1 8 9 10 

第4趟排序:

6 5 4 3 2 1 7 8 9 10 

第5趟排序:

5 4 3 2 1 6 7 8 9 10 

第6趟排序:

4 3 2 1 5 6 7 8 9 10 

第7趟排序:

3 2 1 4 5 6 7 8 9 10 

第8趟排序:

2 1 3 4 5 6 7 8 9 10 

第9趟排序:

1 2 3 4 5 6 7 8 9 10 

第10趟排序:

1 2 3 4 5 6 7 8 9 10 

 

改进的冒泡算法?加个是否交换标志 exchange

 

2. 快速排序

快速排序(Quick Sort)的基本思想是:通过不断比较关键码,以某个记录为界(该记录称为支点),将待排序列分成两部分。其中,一部分满足所有记录的关键码都大于或等于支点记录的关键码,另一部分记录的关键码都小于支点记录的关键码。把以支点记录为界将待排序列按关键码分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序为止。

 

代码如下:为什么老觉得写出来的代码怪怪的。

package sort.exchange;

/**
 * 快速排序算法
 * 
 * @author king
 */
public class QuickSort {
	
	private static int count = 1;
	//定义两个标志位分别指向待排序数组最低端和最高端
	public static void quickSort(int[] data, int low, int high) {
		int i = low;
		int j = high;
		// 取一个支点,类似于哨兵
		int temp = data[low];
		while (low < high) {
			while (low < high && data[high] >= temp) {//从左向右
				--high;
			}
			data[low] = data[high];
			if (low < high)
				low++;
			while (low < high && data[low] <= temp) {//从右向左
				++low;
			}
			data[high] = data[low];
			if (low < high)
				--high;
		}
		data[low] = temp;//将哨兵插入到最后替换的位置
		System.out.println("第" + count + "趟排序:");
		for (int k = 0; k < data.length; k++) {
			System.out.print(data[k] + " ");
		}
		count++;
		System.out.print("\n");
		// 一趟快速排序实现的效果就是
		// 比哨兵的值大的数据在哨兵的右边
		// 比哨兵的值小的数据在哨兵的左边
		// 然后就递归实现整个数组的排序
		if (i < low - 1) {
			quickSort(data, i, low - 1);
		}
		if (low + 1 < j) {
			quickSort(data, low + 1, j);
		}
	}
	public static void main(String[] args) {
		int[] data = new int[]{10,9,8,7,11,5,4,3,2,1};
		quickSort(data, 0, data.length - 1);
	}
}

 运行结果 :

 

第1趟排序:

 

1 9 8 7 2 5 4 3 10 11 

 

第2趟排序:

 

1 9 8 7 2 5 4 3 10 11 

 

第3趟排序:

 

1 3 8 7 2 5 4 9 10 11 

 

第4趟排序:

 

1 2 3 7 8 5 4 9 10 11 

 

第5趟排序:

 

1 2 3 4 5 7 8 9 10 11 

 

第6趟排序:

 

1 2 3 4 5 7 8 9 10 11 

 

 

 

1
2
分享到:
评论

相关推荐

    SPT-08-排序-交换和选择.pdf

    常见的内部排序算法包括插入排序、交换排序、选择排序、归并排序和计数排序等。 插入排序是基于一个元素一个元素地插入到已排序序列中的基本排序方法,它包含直接插入排序、折半插入排序和2路插入排序等变体。选择...

    C#四种排序方法--交换排序 选择排序 冒泡排序 插入排序

    交换排序 选择排序 冒泡排序 插入排序

    用蛮力法实现选择排序,冒泡排序程序;用减治法实现插入排序;分治法应用-快排,合并排序,0-1背包问题;Prim算法求最小生成树。伪代码以及java代码实现

    在选择排序和冒泡排序中,蛮力法可以通过多次比较和交换来实现排序。 选择排序算法描述: Selectionsort(A[0..n-1]) ∥ input 待排序数组 A[0..n-1] ∥ output 升序排序的数组 A[0..n-1] for i &lt;- 0 to n-2 do min...

    冒泡排序-排序过程 冒泡排序-排序过程

    冒泡排序是一种简单的排序算法,其基本思想是通过重复地遍历要排序的列表,比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复进行的,直到没有再需要交换的元素,也就是说该列表已经...

    排序算法.doc 详细讲解了插入排序、交换排序、选择排序、归并排序等排序算法的原理以及实现代码

    2. **交换排序**: - 交换排序包括著名的快速排序和冒泡排序,它们通过交换相邻元素来达到排序的目的。 - 冒泡排序是最简单的交换排序,通过不断交换相邻的错误顺序对,逐步将最大(或最小)的元素“冒泡”到数组...

    数据结构第23讲-插入排序2和交换排序-CPPT课件.ppt

    数据结构第23讲-插入排序2和交换排序-CPPT课件.ppt

    数据结构:交换排序-冒泡排序实验指导

    ### 数据结构:交换排序-冒泡排序实验指导 #### 实验背景与目标 在计算机科学领域,数据结构和算法是核心研究对象,其中排序算法作为基础且重要的算法之一,广泛应用于各类数据处理场景。本实验旨在深入理解并掌握...

    07-排序1. 排序(25).zip

    2. 插入排序:将每个元素插入到已排序部分的正确位置,分治思想的一种体现。 3. 选择排序:每次找出未排序部分的最大(或最小)元素,放到已排序部分的末尾。 4. 快速排序:利用分治策略,选取一个基准值,将数组...

    经典排序算法源代码-插入排序-选择排序-冒泡排序

    - 特点:冒泡排序同样具有O(n^2)的时间复杂度,但其稳定性优于选择排序,即相等的元素不会改变相对位置。然而,对于大规模数据,其效率较低。 - 代码实现通常包含两个嵌套循环,外层循环控制遍历的轮数,内层循环...

    数据结构--排序--思维导图.pdf

    "数据结构--排序--思维导图" 数据结构中排序是指将一组无序的记录序列按照一定的规则排列成有序的序列,排序的目的是为了提高数据的存储和检索效率。排序算法的稳定性是指在排序过程中,如果待排序表中有两个元素Ri...

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

    - 冒泡排序是最简单的排序算法之一,通过不断地交换相邻的逆序元素来逐步将大的元素“冒”到序列的顶端。每一轮排序会确定一个最大(或最小)元素的位置。 - 冒泡排序的时间复杂度同样为O(n²),空间复杂度为O(1)...

    java基础 经典算法之冒泡排序详解

    1.冒泡排序的原理:每次都从第一个元素开始(索引0),向后两两比较,只要后面的比前面的大,就交换(从大到小) 2.通过画图分析,5个数字排4趟,n数字排n-1趟,而外层的for循环代表的是循环的趟数,所以外层循环的结束条件是...

    简单排序算法--类的简单使用

    2. **C++类的定义**:一个类通常由数据成员(变量)和成员函数(方法)组成。在这个例子中,可能会有一个类`SortAlgorithms`包含各种排序算法的成员函数,如冒泡排序、选择排序、插入排序、快速排序等。另一个类`...

    数据结构-排序PPT课件.pptx

    基于不同的“扩大”有序序列长度的方法,内部排序方法大致可分为插入类、交换类、选择类、归并类、基数排序等类型。 6. 插入排序:插入排序的基本思想是:每步将一个待排序的对象,按其关键码大小,插入到前面已经...

    经典排序算法,有选择排序,冒泡排序,交换排序,谢尔排序,插入排序基数排序

    交换排序可以看作是一种广义的排序策略,其中冒泡排序和选择排序都可以归类于这一大类。其核心在于两两比较相邻元素,如果顺序错误则进行交换,直至整个序列有序。 ### 4. 希尔排序(Shell Sort) 希尔排序是插入...

    排序-动图.zip

    这里我们关注的是“排序-动图.zip”文件,它很可能包含了一系列动态图像,直观地展示了不同的排序算法工作原理。虽然没有具体的标签信息,我们可以根据文件名推测其内容可能涵盖了各种排序算法的动画演示。 首先,...

    第七章:外部排序-20211

    在本章“第七章:外部排序-20211”中,主要讲解了如何在磁盘文件或磁带文件等外部存储介质上进行排序。外部排序的主要挑战在于频繁的磁盘I/O操作,因为相比内存,磁盘的存取速度慢得多。 1. **外部排序的基本概念**...

    冒泡排序-14-表单提交.ev4.rar

    在这个"冒泡排序-14-表单提交.ev4.rar"压缩包中,很可能包含了一个关于冒泡排序的示例讲解,可能是一个教学视频"冒泡排序-14-表单提交.ev4.mp4"。 冒泡排序的基本思想是通过重复遍历待排序的数列,一次比较两个元素...

    常用的内部排序---源码

    本资源提供的“常用的内部排序---源码”包含了C语言实现的一些经典排序算法,这对于学习和理解这些算法的工作原理非常有帮助。 1. **冒泡排序**:冒泡排序是最简单的排序算法之一,通过不断交换相邻的错误位置元素...

    作业:排序-答卷-20221211115704.zip

    标题中的"作业:排序-答卷-20221211115704.zip"表明这是一个关于排序算法的作业提交,其中包含了学生的答案。由于没有具体的标签信息,我们可以从排序算法这个主题出发,深入探讨排序算法的相关知识点。 排序算法是...

Global site tag (gtag.js) - Google Analytics