1.冒泡排序
基本步骤:依次比较相邻两个元素的大小,如果a[i]>a[i+1],则进行交换;从第一对到最后一对,由此即可将最大元素放置到序列末尾。接着对n-1个元素重复上诉步骤;
改进:设置flag标志,如果在一轮循环结束后,没有出现元素交换,则表示该序列已经是排序好的,无需继续进行。
代码如下:
public class BubbleSort{
public static void main(String[] args) {
int[] a = {2,3,1,4,6,0};
sort(a);
for(int i = 0;i<a.length;i++)
System.out.println(a[i]);
}
public static void sort(int[] a){
int len = a.length;
for(int i = 0;i<len;i++){
boolean flag = true;
for(int j = 0;j<len-i-1;j++){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = false;
}
}
if(flag)
break;
}
}
}
2.快速排序
快速排序的基本思想:
首先从序列中选择一个数作为基准值,在第一轮排序后将序列分成两部分,前半部分的值都比基准值小,后半部分都比基准值大,然后对左右分区重复上诉步骤。整个排序过程可以递归进行,由此实现排序过程。
这篇博文描述的快速排序的过程https://www.cnblogs.com/MOBIN/p/4681369.html
博主将快速排序联想为“东拆西补或西拆东补,一边拆一边补”,直到所有元素达到有序的状态,我觉得很生动,帮助我理解快速排序的实现过程,所以进行了参考,侵权删。
我是把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态。
算法步骤:
1.设置两个变量i,j作为指针,i指向最左边的元素,j指向最右边的元素;
2.这里将第一个元素a[t]作为基准值(一般选择a[0]);
3.首先将基准值复制到临时变量temp中,这样a[t]处即为空;
4.从j开始由右至左开始扫描,当遇到a[j]小于temp,则将补上a[t]处的空缺,此时a[j]处为空;
5.接着从i开始由左向右扫面,当遇到a[i]大于temp,则将补上a[j]处的空缺,此时a[i]处为空;
6.如此进行,直到j==j,那么temp放置到此处,则完成第一轮的排序;
7.使用递归思想,分别对左半区间和右半区间重复上诉过程。
代码实现如下:
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {2,3,1,4,6,0};
int len = a.length;
sort(a,0,len-1);
for(int i = 0;i<a.length;i++)
System.out.println(a[i]);
}
public static void sort(int[] a, int left, int right){
int temp = 0;//定义临时变量
int l = left;//保存左指针
int r = right;//保存右指针
if(left<right){
temp = a[left];
while(left < right){
while(left < right && a[right] >= temp){
right--;
}
a[left] = a[right];
while(left < right && a[left] <= temp){
left ++;
}
a[right] = a[left];
}
a[left] = temp;
sort(a, l,left-1);
sort(a, left+1,r);
}
}
}