快速排序,个人见解,以及一些比较基础的算法。

老师有讲快速排序,但是不是很细的讲,看完大佬的解释之后,有自己的见解。

其实排序有很多种,最简单的肯定就是冒泡排序咯。这个很简单,也是最好理解的一种方法。但是这个方法会比较耗时。

大家也应该都知道直接排序吧。这个算法和冒泡排序很相像,但是它的耗时会更短。大体是比冒泡排序少了很多交换的步骤。

以下是java写的程序。

package item;
import java.util.Scanner;
public class dirsort {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println("一共"+n+"个数");
int array[]=new int[n] ;
int m;
for(int i=0;i<n;i++) {
	m=sc.nextInt();
	array[i]=m;
	System.out.println("第"+(i+1)+"数为:"+m);
}
dirsort sorter=new dirsort();//创建直接排序的对象
sorter.sort(array);//调用排序对象的方法。
	}
	public void sort(int[] array) {
				for(int i=1;i<array.length;i++) {
					int index=0;//注意index的位置,每次大循环,index就要归零,开始从第二个比大小。
					for(int j=0;j<array.length-i;j++) {//这里记住,假如一共有n个数,第m次大循环,对应n-m次小循环
						if(array[index]<array[j])
							index=j;//比冒泡排序快在这里,并不是不断地换位,而是找到最大的index
					}
					int temp=array[array.length-i];//将目前找到最大的数与最前端的一个数交换,减少了交换的次数。
					array[array.length-i]=array[index];
							array[index]=temp;
				}
				showarray(array);
	}
	public void showarray(int[] array) {
		for (int i :array)
			System.out.print("<"+i);
	}
}

还是很基础的程序,不咋费脑子。

接下来就是快速排序了,我们首先得知道它的原理。一个数组,每个数在排序后都有自己的位置。比如[1,3,2,5,4],我们在排完序之后,能够确定各个数的位置,如4,就在第四个位置,在4左边的是比4小的数,右边是比4大的数。我们首先可以将它的位置确定下来,不管,它左边或者右边的数的大小排序。我们只要确保4它在正确的位置就行。

排完个个数之后会自然形成从小到大(或者从大到小)的数组。

至于如何将比那个数小的数放在左边,比他大的数放在右边。就是算法的关键。

这个,其实也挺简单的。我们一个一个数的排序嘛。首先是第一个数。我们从两边开始看,最左边就向右移动,找到一个比第一个数大的,最右边就向左移动,找到一个比第一个数小的。然后就将这两个值换位,然后在开始找下一个进行替换。直到我们从左边数的位置  i  和到右边数的位置  j  重和。有人可能就会问,如果一个数组是着样的呢[5,1,2,3,6]?我们从左边开始,便是6,没东西可以换呀,所以,我们刚刚说的玩意儿是有次序的。我们首先从左找,找到之后才会让它从最右边找。(当然如果先从最右边找,然后再找左边的数。)这个时候左边找到的数的位置已经和j重和了。就直接交换5和3的位置。

以下便是代码分析逐行分析。

def quick_sort(array, start, end):#定义函数,start和end便是这个数组需要排序的一段。
    if start >= end:
        return  #这种情况肯定是不允许的
    mid_data, left, right = array[start], start, end
    while left < right:#left和right对应的就是i,j
        while array[right] >= mid_data and left < right:
            right -= 1#直到找到一个比第一个数小的数为止。
        array[left] = array[right]
        while array[left] < mid_data and left < right:
            left += 1#直到找到一个比第一个数大的数
        array[right] = array[left]#两个while下的交换正是找到了一对,然后交换数字位置。第一个while下的交换后,就会出现两个array[right]的值,第二次while后,出现一个array[right]值,和一个array[left]值。第三个while最后一次循环中
    array[left] = mid_data#这个时候就是while最外层结束了,换第一个数,把他放到对应位置。
    quick_sort(array, start, left - 1)#迭代函数,将其分成两个部分,然后再分别对这两个部分排序。里面可能还会循环很多次。
    quick_sort(array, left + 1, end)
def quick_sort(array, start, end):
    if start >= end:
        return
    mid_data, left, right = array[start], start, end
    while left < right:
        while array[right] >= mid_data and left < right:
            right -= 1
        array[left] = array[right]
        while array[left] < mid_data and left < right:
            left += 1
        array[right] = array[left]
    array[left] = mid_data
    quick_sort(array, start, left - 1)
    quick_sort(array, left + 1, end)

这个代码是借鉴其他大佬的,写的很简练,比鄙人写的好,所以就没有用自己的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值