常见排序算法01
1、冒泡排序
冒泡排序思想是从头开始扫描待排序的元素,在这过程中相邻两个元素之间进行比较,将较大的数向后移,(即大数向下沉,小数向上冒),经过从头到尾的一次扫描后,当前最大的数就会被移动到最后一位了,然后记下这个位置,下一次扫描只需扫描到这个位置即可(即第i次扫描需要比较n-i次)。第i次扫描会将一个第i大的数排到倒数第i位上。
代码实现:
public void MPsort(){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1-i; j++) {
if(a[j]>a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
2、快速排序
快速排序思想是在所要排序的序列中找一个数作为基准数(pivot),一般选择所要比较的序列中第一个数,然后将比基准数大的放在基准数的右边,比基准数小的放在其左边。这样经过一次排序后,这个基准数的位置就会确定下来了。确定这个基准数后再对其左右两边的数分别做以上操作,最终即可确定所要数的位置了。
举例说明:(图片来源网上)
如图所示,有10位数组成的序列。设置两个哨兵,令哨兵i指向第一个元素,则6为当前基准数,令j指向最后一个元素。
首先令哨兵j开始向左移动,直至找到一个比基准数6小的数,如图找到数字5;然后哨兵i开始向右移动,直至找到一个比基准数6大的数,如图找到7.然后将5和7进行交换。
第一次交换结束后,j继续移动,找到4;i移动,找到9,将4和9进行交换。
最后,i和j在3的前面相遇,这时一次扫描完成,将基准数与3交换,此时基准数6的位置已经确定了。
在这之后,分别考虑6左边的序列3,1,2,5,4和其右边的序列9,7,10,8即可。(使用递归)
代码实现:
public static void quicksort(int left,int right){
int pivot = a[left];//基准数
int i = left,j = right;
int temp;
if(i>=j){//只有一个元素做比较时
return;
}
while(i!=j){
//要先从右边开始,找小于pivot的数
while(i<j&&a[j]>=pivot){
j--;
}
//再找左边大于pivot的数
while(i<j&&a[i]<=pivot){
i++;
}
//交换
if(i<j){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
//此时i,j相遇(i=j),则将基准与a[i]交换
a[left] = a[i];
a[i] = pivot;
//使用递归,分别处理当前基准的左右两边
quicksort(left,i-1);
quicksort(i+1,right);
}
3、 选择排序
在需要排序的序列中选出最小的元素,然后与第一个元素交换,接着在剩下的元素中选出最小的与第二个元素交换,以此类推。
代码实现:
public void selectSort(){
int position = 0,temp = 0;
for (int i = 0; i < a.length; i++) {
temp = a[i];
position = i;//当前最小元素下标
for (int j = i+1 ; j < a.length; j++) {
if(a[j]<temp){
temp = a[j];
position = j;
}
}
a[position] = a[i];
a[i] = temp;
}
}