基本思想:交换排序顾名思义就是将两个数进行比较来交换两个数在记录中的位置,例如6 4 2 5 例如6和2进行比较,(由小到大排序)6和2交换位置
主要算法
1》.冒泡排序
冒泡排序:待排序数从后往前 或者从前往后 两两比较,若为逆序则交换,知道所有的数都比较完,则为一趟排序,每一趟排序后就有一个数被确定在最终位置。举个例子:
所以 ,在冒泡排序中最主要要学到的就是 怎么进行两两交换数的思想
//核心算法
//A是待排序数组 n是表长
public void BubbleSort(int[] A,int n ){
int i,j;
//i代表排序的趟数
for(i=0;i<n;i++){
//j工作指针 从后往前排 每排一次就会少一个数参与排序
for(j=n-1;j>i;j--){
if(A[j]<A[j-1]){
//交换两个数 这个在很多算法中都有应用
int temp=A[j];
A[j]=A[j-1];
A[j-1]=temp;
}
}
}
}
2》快速排序
快速排序是一种比较重要的排序的算法 其基于分治思想的算法。
举一个通俗的例子来理解:有5个人 每个人手里都拿有棒棒糖 现在老师让这5个人按手里棒棒糖多少进行排序 此时大家都不知道彼此手里的棒棒糖 那么怎么排序呢?这时就需要一个参照(基准元素),此时第一个人就说:我来做参照,如果比我手里棒棒糖多的就站在我的左边 比我少的就站在我的右边。为了效率 最左边和最右边就定了一个规则,假设从最左边开始比较 如果左边的人手里棒棒糖比参照多就还是左边的人与参照比较(即从左往右的方向进行),但是如果一遇到比参照小 那么就需要把比较出来较小的这个人交换到右边位置 此时左边的人就要等右边的人与参照进行比较了......按这个思想来看下面的例子
从过上面的一趟排序后,3 8 9 21 11 25 19 所得我们可以得出的结论是:
1.基准元素9左边的元素都比基准元素小,右边的元素都比基准元素大
2.进行第二次排序时 显然9就不需要再参与排序 而是分别对9左边和右边分别进行上面一样的算法---这就是递归思想
代码实现:
package suanfa;
public class InsertSort4 {
//找基准元素
int part(int A[],int low,int high){
int pivot;//基准元素
pivot=A[low];//把数组元素的第一个值作为数组元素
//一趟排序结束跳出的条件
while(low<high){
//左边的元素大于基准元素 就从左往右进行比较
while(low<high && A[high]>=pivot)
high--;
A[low]=A[high];
//右边的元素小于基准元素就从右往左进行比较
while(low<high && A[low]<=pivot)
low++;
A[high]=A[low];
}
//一趟排序结束 将基准元素放在最终位置
A[low]=pivot;
//将基准元素返回
return low;
}
//快速排序
void Quicksort(int A[],int low,int high){
if (low<high) {
//获得基准的位置
int positition=part(A, low, high);
//进行递归排序
Quicksort(A, low, positition-1);
Quicksort(A, positition+1, high);
}
}
//测试
public static void main(String[] args) {
int[] A={2,12,6,8,11,31,18};
int n =A.length-1;
InsertSort4 insertSort = new InsertSort4();
insertSort.Quicksort(A, 0, n);
for(int i=0;i<=n;i++){
System.out.println(A[i]);
}
}
}