老师有讲快速排序,但是不是很细的讲,看完大佬的解释之后,有自己的见解。
其实排序有很多种,最简单的肯定就是冒泡排序咯。这个很简单,也是最好理解的一种方法。但是这个方法会比较耗时。
大家也应该都知道直接排序吧。这个算法和冒泡排序很相像,但是它的耗时会更短。大体是比冒泡排序少了很多交换的步骤。
以下是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)
这个代码是借鉴其他大佬的,写的很简练,比鄙人写的好,所以就没有用自己的。