算法设计之快速排序

被问到排序,可能以前一直没用重视它,好高骛远基本功不扎实,这次准备好好整理下快速排序的知识,从而深入研究看看能不能向前推广到其他编程题的应用。

1.算法简介:

原理:快速排序是对冒泡排序的一种改进,首先选择序列中第一个记录为轴值(pivot),然后两边执行冒泡排序找到pivot的位置, 返回pivot的位置,然后两边数组继续叠代。

我觉得快速排序的算法写不出主要原因是 ①冒泡排序理解不深 或者② 没有递归叠代思想

2.代码:

package quick_sort;

import java.util.Arrays;
import java.util.Scanner;

public class Quick_Sort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		int nums[] = new int[8];
		for(int i = 0; i < nums.length; i++)
			nums[i] = sc.nextInt();
		
		quicksort(nums,0,nums.length-1);
		
		System.out.println(Arrays.toString(nums));
		
		sc.close();
		
	}
	
	public static void quicksort(int[] nums,int low, int high)
	{
		if(low < high) {
			int mid = partition(nums, low, high);
			quicksort(nums, low, mid-1);
			quicksort(nums, mid+1, high);
		}
	}
	
	public static int partition(int[] nums, int low, int high)
	{
		int pilot = nums[low];
		while(low < high)
		{
			while(pilot <= nums[high] && low < high)
			    --high;
			nums[low] = nums[high];
		
			while(pilot >= nums[low] && low < high)
				++low;
			nums[high] = nums[low];
		}
		nums[low] = pilot;
		
		return low;
		
	}

}


画一张如此的图:

算法设计之快速排序_第1张图片

记住游戏规则就是先和nums[high]比,比不过就high--,比得过就要nums[low]=nums[high]把位置换回来,然后pivot再和数组前面的比小,这样直到整个数组排序贯穿,得到low与high重合的位置就是pivot的位置,将他返回继续下一次递归。

3.增进:

有人说pivot的初始值是数组的第一个元素可能会造成整个数组的排序变慢(可能这个数组是有规律的),建议改成pivot初始值随机。

非递归的栈方法

4.拓展

正如我前面所说,我觉得快排的思想主要是冒泡排序的继承和递归叠代思想

冒泡排序是最好实现又理解最简单的排序,在编程中会经常有数组元素与指针关系的思想,什么时候做元素交换,什么时候要保存数组值,不仅仅是数组,任何数据结构对于边界值和插入删除增加的元素操作都要涉及这一基本思想。

叠代递归从数据结构导论动态规划那一章的伐木头问题开始,到各大企业的笔试面试题应该是必考的项目之一,如何把一个大问题分成逐个小问题然后系统的解决实际问题,我觉得一般人的话还是要多接触多思考,不能囫囵吞枣,妄图通过一道两道题一叶知秋,正如快排这种算法是深入了解递归思想的很好的途径。

下一次面试考快排还记不得怎么办?

这个问题正如怎么解决死锁问题一样,最好的解决方法是做好准备不让这种问题发生,所以要每天多读多看勤锻炼。万一发生了就以付出最小的代价为目标吧。

你可能感兴趣的:(技术面试)