Java分治法快速排序实现寻找数组中第二大的元素

题目如下:

给出一个分治算法来找出n个元素序列中第二大的元素。

我选择的分治算法是快速排序算法。

数组通过随机数来产生。

代码实现如下:

package 实验测试;

import java.util.Scanner;

public class SIX {
	public static void main(String args[]) {
		int n;
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		int arr[] = new int [n];
		int low = 0;
		int high = arr.length-1;
		for(int i = 0; i < n; i++) {
			arr[i] = (int)(Math.random()*10000);
		}
		KP a = new KP();
		a.quicksort(arr, low, high);
		System.out.print("排序好的序列为:");
		for(int w = 0; w < arr.length; w++) {
		System.out.print(arr[w]+"  ");
		}
		System.out.println();
		for(int q = arr.length - 1; q >= 0; q--) {
			if(arr[q] != arr[q-1]) {
				System.out.print("第二大的元素为:"+arr[q-1]);
			}
			break;
		}
	}
}

class KP{
	void quicksort(int arr[], int low, int high) {
		if( low > high) {
			return;
		}
		//2, 存
		int i = low;
		int j = high;
		//3,key
		int key = arr[low];
		//4,完成一趟排序
		while( i< j) {
			//4.1 ,从右往左找到第一个小于key的数
			while(i<j && arr[j] > key){
				j--;
			}
			// 4.2 从左往右找到第一个大于key的数
			while( i<j && arr[i] <= key) {
				i++;
			}
			//4.3 交换
			if(i<j) {
				int p = arr[i];
				arr[i] = arr[j];
				arr[j] = p;
			}
		}
		// 4.4,调整key的位置
		int p = arr[i];
		arr[i] = arr[low];
		arr[low] = p;
		//5, 对key左边的数快排
		quicksort(arr, low, i-1 );
		//6, 对key右边的数快排
		quicksort(arr, i+1, high);
	}
}

运行截图如下:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java实现如下算法: 1.链表 链表用来存储数据,由一系列的结点组成。这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是用来存储数据的,与链表相比,需要初始化时确定长度。一个数组内的数据都是同一类型。在Java中,ArrayList是通过数组实现,而LinkedList则通过链表实现。一个简单的链表类如下: 2.二叉树 二叉树是n(n>=0)个结点的有序集合。每个结点最多有2个子节点,即左结点和右结点,且左右结点顺序不能更改。 当n=0时,为空二叉树;当n=1时,为只有一个根二叉树。 3.排序 (1)冒泡排序 重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。时间复杂度 O(n2),为稳定算法。 将数依次进行比较,并将大(或小)的,网后放,如下: (2)快速排序 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 (3)选择排序 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。 (4)插入排序 每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。 每一个数和它前面的数依次进行比较,因为前面的数的顺序是已经排好的 (5)希尔排序 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 (6)归并排序 建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。时间复杂度O(n log n) 。 (6)堆排序 利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素
快速排序(Quick Sort)是一种常用且高效的排序算法,它通过分治的思想将一个大问题分解为若干个小问题进行解决。在 Java 中,可以使用递归来实现快速排序。 下面是一个简单的 Java 实现示例: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivot = partition(arr, low, high); // 划分操作,获取基准元素的位置 quickSort(arr, low, pivot - 1); // 对基准元素左边的子数组进行快速排序 quickSort(arr, pivot + 1, high); // 对基准元素右边的子数组进行快速排序 } } public static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选择第一个元素作为基准元素 while (low < high) { while (low < high && arr[high] >= pivot) { high--; } arr[low] = arr[high]; // 将比基准元素小的元素移到左边 while (low < high && arr[low] <= pivot) { low++; } arr[high] = arr[low]; // 将比基准元素大的元素移到右边 } arr[low] = pivot; // 将基准元素放入正确的位置 return low; // 返回基准元素的位置 } public static void main(String[] args) { int[] arr = {5, 2, 8, 9, 1, 3}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } } ``` 以上代码中,`quickSort` 方法用于实现快速排序,它首先通过 `partition` 方法将数组划分为两个部分,左边的部分小于等于基准元素,右边的部分大于等于基准元素。然后递归地对子数组进行快速排序。`partition` 方法选择第一个元素作为基准元素,通过双指针的方式将小于基准元素元素移到左边,大于基准元素元素移到右边,最后将基准元素放入正确的位置。 运行以上代码,输出结果为 `[1, 2, 3, 5, 8, 9]`,表示数组已经按照从小到大的顺序排序好了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值