`
若是人间
  • 浏览: 76295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

快速排序

阅读更多

 

假设一个数

 

66 8 5 44 9 77 2 33 41 15 42 69

 

现在随机挑选一个键值,假设我们选到的是41 ,把41 作为key 值存在。设左部序列标为i, 右部序列标为j, 将这个数列升序排序。

 

从左边开始,6641 来得大,两者交换,现在key41 在第一位,i 指向第一位,

 

得到的序列为:41 (I) 8 5 44 9 77 2 33 66 15 42 69(J)

 

轮到右部,找到第一个比41 小的数为45 者交换,现在i 指向第一位,j 指向右第三位,key 值在第8 位,即跟j 重合。

 

得到的序列为: 15(I) 8 5 44 9 77 2 33 66 41(J) 42 69

 

继续比i4441 来得大,两者交换,现在i 指向第四位,j 指向右数第三位,ikey 重合,

 

得到的序列为:15 8 5 41i9 77 2 33 66 44 (j) 42 69;

 

 

j 继续往下移,3341 来得小,两者交换,现在i 指向第四位,j 指向右数第六位,key 与是重合,

 

得到的序列为: 15 8 5 33i9 77 2 41(j) 66 44 42 69

 

i 往下,7741 来得大, 交换

 

得到的序列为:15 8 5 33 9 41i2 77(j) 66 44 42 69

 

j 往下,241

 

得到的序列为: 15 8 5 33 9 2i41(j) 77 66 44 42 69

 

i 往下,ij 重合

第一轮排序结束,得到序列 15 8 5 33 9 2 41 77 66 44 42 69

 

现在把序列为分两部分,左部为 15 8 5 33 9 2

右部为 41 77 66 44 42 69

同样排序

 

得最后排序结果: 2 5 8 9 15 33 41 42 44 66 69 77

 

 

java实现如下:

    Sort接口:

 

package com.javaeye.rsrt;

public interface Sort {
	
	/**
	 * 供程序使用的快速排序的接口
	 * @param num 要进行排序的数序
	 * @return 排好序的数列
	 */
	public int[] BeginSort(int[] num);

}

 QuickSort类:

 

package com.javaeye.rsrt;

/**
 * 
 * @author nishiting
 * 
 * 原理:要求将传进来的数列进行排序,快速排序是冒泡法的一个改进版,先通过第一轮排序把数列分为
 * 两部分,一部分比关键值小,一部分比关键值大,然后将分开的两部分再进行排序,直到排序结束为止。
 *
 */
public class QuickSort implements Sort {
	

	@Override
	public int[] BeginSort(int[] num){
		
		Sort(num,0,num.length-1);
		
		System.out.print("num:");
		for(int i = 0;i<num.length;i++){
		
		System.out.print(num[i]+"   ");
		}
		System.out.println();
		return num;
	}
	
	/**
	 * 将排序方法进行递归,从而得到最终结果
	 * @param num 要进行排序的数列
	 * @param start 排序那段的起始位置
	 * @param end  要排序那段的结束位置
	 * 
	 */
	
	private void Sort(int[] num, int start, int end){
		
		/**
		 * 如果开始的位置超出了结束位置,则程序可以结束,如果两者相等,则代表只排序一个元素,可以不必排序,直接返回
		 */
		
//		if(start >= end){
//			
//			return;
//			
//		}
		
		/**
		 *key得到第一轮排序好的关键值的位置,
		 *将数列分为两部分进行递归,第一部分为key左边的部分,值都比key来的小,
		 *第二部分为key右边的部分,值都比key来的大。
		 *
		 * 
		 */
		
		if(start<end){
		
		int key = Partition(num,start,end);
		Sort(num,start,key-1);
		Sort(num,key+1,end);
		
		}
		
		
		
	}
	
	/**
	 * 将数列分为两部分,左部为比关键值小的,右部为比关键值大的,这边取比关键值大的
	 * @param num 要进行排序的数列
	 * @param start 排序那段的起始位置
	 * @param end	要排序那段的结束位置
	 * @return 关键值的位置
	 */
	private int Partition(int[] num,int start,int end){
		int i = start;
		int j = end;
		int temp;
		
		
		/**
		 * 如果开始的位置小于结束的位置,则代表至少还有两个元素,要将其进入循环排序
		 */
		while(i < j){
			
			/**
			 * 从结束位置开始查找,找到第一个比关键值小的元素
			 * 
			 */
			
			while (i<j && num[i]<=num[j]) j--;
			
			/**
			 * 如果这时左边向标小于右边向标的话,则将右部比关键值小的数与关键值进行交换,将i加1,进行左部查找
			 */
			
			if(i < j){
				
				temp = num[i];
				num[i] = num[j];
				num[j] = temp;
				i++;
			}
			
			/**
			 * 从开始位置开始查找,找到第一个比关键值大的元素
			 * 
			 */
			
			while (i<j && num[i]<=num[j]) i++;
			
			/**
			 *  如果这时左边向标小于右边向标的话,则将左部比关键值大的数与关键值进行交换,将j减1,进行右部查找
			 * 
			 */
			
			if(i < j){
				
				temp = num[i];
				num[i] = num[j];
				num[j] = temp;
				j--;
			}

		
		/**
		 * 返回这时关键值的位置
		 */
		return i;
	}
	
	

}
 

   测试用例:

   QuickSortTest类:

 

package com.javaeye.rsrt;

import junit.framework.TestCase;

public class QuickSortTest extends TestCase {
	
	
	public void testSort(){
		
		QuickSort sort = new QuickSort();
		/**
		 * 测试输入值为空的情况
		 */
		int[] num = {};
		int[] values = {};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试输入值为一个的情况
		 * 
		 */
		num = new int[] {1};
		values = new int[] {1};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试输入为两个升序的情况
		 * 
		 */
		num = new int[] {1,2};
		values =new int[] {1,2};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试输入两个降序的情况
		 * 
		 */
		num = new int[]{2,1};
		values = new int[] {1,2};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试输入多个的情况
		 * 
		 */
		num = new int[] {1,66,4,7,3,42,11,44,2,87};
		values = new int[] {1,2,3,4,7,11,42,44,66,87};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试包含不规则数字情况
		 */
		num = new int[] {01};
		values = new int[] {01};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试多个包含不规则数字情况
		 */
		num = new int[] {01,1,4,04,6,07,03,2};
		values = new int[] {1,01,2,03,4,04,6,07};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试包含有一个负数的情况
		 */
		num = new int[] {-1};
		values = new int[] {-1};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		/**
		 * 测试包含有多个负数的情况
		 * 
		 */
		num = new int[] {-1,8,3,-2,77,-44,11};
		values =new int[] {-44,-2,-1,3,8,11,77};
		sort.BeginSort(num);
		for(int i =0;i<num.length;i++){
			assertEquals(num[i], values[i]);
		}
		
		
		
	}
	

}
 

 

 

0
1
分享到:
评论

相关推荐

    快速排序 快速排序例子

    ### 快速排序知识点解析 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...

    C语言实现多种链表快速排序

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录...

    快速排序 快速排序快速排序快速排序

    快速排序快速排序 快速排序 快速排序 快速排序 快速排序

    确定性快速排序与随机化快速排序的比较

    快速排序是一种高效的排序算法,在计算机科学和数学中被广泛研究。其基本原理是分治法策略,即将一组数据分为两个子序列并分别进行排序。快速排序期望的时间复杂度为O(nlogn),但在最坏的情况下,它的时间复杂度可...

    简单的快速排序

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),即把一个大问题分解成若干个小问题来解决,最终将小问题的结果合并得到原问题的解。在这...

    排序算法编程 堆排序 快速排序

    本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...

    快速排序 --- 非递归实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按...

    快速排序算法(c#实现)

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...

    随机快速排序 算法设计与分析实验报告

    (1)用随机快速排序的方法,对输入的数值以从大到小的顺序进行快速排序。 (2)对随机快速排序和冒泡排序这两种排序方法进行比较,测试其在不同数值大小的情况下算法运行的时间复杂度。 二、 实验要求 快速排序...

    快速排序算法的java实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...

    冒泡排序和快速排序的时间性能

    冒泡排序和快速排序的时间性能 冒泡排序和快速排序是两种常用的排序算法,它们的时间性能是开发者和研究人员所关心的热点话题。在本文中,我们将对冒泡排序和快速排序的时间性能进行深入分析和比较。 冒泡排序是一...

    快速排序的递归简洁实现

    快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔于1960年提出。它采用分治策略来把一个序列分为较小的两个子序列,然后递归地对子序列进行排序,最终合并得到有序序列。快速排序在平均情况下的时间...

    TIA博途中通过SCL语言实现快速排序的具体方法示例.docx

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法的策略,通过选取一个基准值并重新排列数组,将问题分解为较小的部分,然后递归地对这些部分进行排序,最终达到整个序列...

    FPGA并行快速排序算法-位宽可设

    在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...

    快速排序演示程序/vc++/mfc

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治策略,通常比其他O(n^2)时间复杂度的排序算法更快,平均时间复杂度为O(n log n)。在本项目中,“快速排序演示程序/vc++/mfc...

    《快速排序 直接插入排序 堆排序 希尔排序 选择排序:五种排序》

    (1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...

    数据结构 快速排序 输出每一趟结果

    根据给定文件的信息,我们可以总结出以下关于“数据结构 快速排序 输出每一趟结果”的知识点: ### 一、快速排序的基本概念 快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列...

    快速排序算法和冒泡排序效率对比

    快速排序和冒泡排序是两种常见的排序算法,它们在计算机科学中扮演着重要的角色,特别是在数据处理和优化程序性能方面。本篇文章将深入探讨这两种排序算法的原理、效率以及它们在C#编程语言中的实现。 首先,让我们...

Global site tag (gtag.js) - Google Analytics