版权声明:本文为博主原创文章,转载时请注明文章出处和作者! https://blog.csdn.net/sb985/article/details/79903187
交换排序
冒泡排序
冒泡排序算法:顾名思义,就是将最重的(最大元素)浮动到最下面,最轻的(最小元素)浮动到最上面.
算法过程:
1.循环数组长度length-1次,下标为i.
因为每次循环后就会出现一个最大(升序)或最小(降序),只需要比较n-1就行
1.1 在前 length-i个元素中循环因为已经有i个已经有序
1.1.2 比较当前元素与后一个元素的大小,如果前者比后者大交换(升序)
//冒泡排序
template <class T>
void BubbleSort(SqList<T> &L){
//非降序排序
T t;
for(int i = 1;i < L.length; ++i){
for(int j = 1;j <= L.length - i; ++j){
if(L.key[j] > L.key[j+1]) {
t = L.key[j];
L.key[j] = L.key[j+1];
L.key[j+1] = t;
}//endif
}//endfor
}//endfor
}
注意:上述算法会对已经有序的部分也进行比较,这不是我们所想要的,可以想办法让已经有序的部分不在比较.
1.可以通过设置标志位,如果发生了交换,则把较大的已经放在后面了,后面的已经有序,不需要在比较后面一有序的部分了,直接进入下一次循环中即可.
2.也可以将上次交换的位置记住,交换后的是有序的,只需要比较交换位置前面的部分即可.
冒泡排序算法优化算法
快速排序
首先任意选取一个数据(通常选用数组的第一个数)作为枢轴,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
参考大神博客,大佬博客
int Partition(int L[],int low,int high){
/*
1.先从后向前分别与枢轴比较,交换,
2.然后从前向后分别与枢轴比较,交换
由于整个过程lwo一直在增加,high一直在减少,所以low<high保证所有元素都与此次所选的枢轴进行了比较,
当low>=high此时在枢轴之前(后)的记录均不大(小)于它,(函数返回枢轴其所在位置)
但是其他元素之前的相对关系没有确定,只是确地了其他元素与此次选定的枢轴之间的关系
所以要对枢轴左右的元素递归使用此方法
*/
int pivo;//枢轴
L[0] = L[low]; //用子表的第一个记录作枢轴记录
pivo = L[low];
while(low < high){ //从表的两端交替向中间扫描
while(low < high && L[high] >= pivo){
--high;
}//endwhile
L[low] = L[high];//将比枢轴小的移动至低端此元素参与小于枢轴的比较
while(low < high && L[low] <= pivo){
++low;
}//endwhile
L[high] = L[low];//将比枢轴大的记录移至高端
}//endwhile
L[low] = L[0]; //枢轴记录到位
return low; //返回枢轴位置
}
void QSort(int L[],int low,int high){
int mid;//接受枢轴位置
if(low < high) {//if low equals high which means all elements had been traversed
mid = Partition(L,low,high);
QSort(L,low,mid-1); //对低子表排序
QSort(L,mid+1,high); //对高子表排序
}//endif
}