冒泡排序
通过相邻元素的比较和交换,将排序码较小的元素逐渐从底部移向顶部。由于整个排序的过程就先水底下面的气泡一样逐渐向上冒,所以称为冒泡排序
void bubbleSort(int a[],int len){
int temp=0;
for(int i =0; i < len;i++){
for(int j = len-1;j>i;j--){
if(a[j]<a[j-1]){
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
}
基本快速排序。。。不稳定 最理想 O(nlogn) 最差时间O(n^2)
* 选取参照值,把数列中小于改值的放左边,大于的放右边--递归
* 整个过程相当于把左右边的值放在合适的位置,中间的位置,即他的排好序的数列的位置
* 快速排序是对冒泡跑排序 的升级改进(书上说的),我更认为的是对选择排序的优化-因为其不稳定的原因正是和选择排序类似-其优化原理类似于希尔排序对插入排序的优化
* 因为冒泡排序是稳定的排序,而快排不稳定,本人完全不明白两者有什么关联---如有知道的还请告知
* 直接插入+shell | 直接选择+堆 | 冒泡+快速排序
* 快速排序的时间,受到参照值的影响,本程序采用最右端的值为参照,并不是最优的取值,根据我的了解,去中间的值会比较好一些
*
* 注意,快速排序没有最后整体排序,但一开始先排了一次。
*/
void quickSort(int arr[],int left,int right){
if(right - left<=0){
return;
}else{
//划分数组
int leftPosition = partition(arr, left, right, arr[right]);
//排序左边的子数组
quickSort(arr,left,leftPosition -1);
//排序右边的子数组======leftPosition这个位置不变因为它是划分点值,
//整个过程相当于选出划分点的位置 及数组最右端值的排序位置,不管两边的值如何换它的位置不变
quickSort(arr,leftPosition+1,right);
}
}
//分组操作--找出中间位置--选择最右边的值为参照值
int partition(int a[],int left,int right,int point){
//point表示数组参照对象,即子数组最右端的索引的值,也可省略此参数,用a[right]代替
int leftPos = left -1;
int rightPos = right;
while(true){//划分数列
//以次选出左边比划分点大的值的索引
while(leftPos < rightPos&&a[++leftPos]<point);
//以次选出右边比划分点小的值的索引
while(rightPos>leftPos&&a[--rightPos]>point);
//如果左右碰面则结束交换,且结束划分
if(leftPos >= rightPos){
break;
}else{
int temp;
temp = a[rightPos];
a[rightPos] = a[leftPos];
a[leftPos] = temp;
}
}
//交换数列最右端的值到合适位置,即leftPos位置
//交换最右端的值和当前碰面点的值,完成最后划分补位
int temp;
temp = a[leftPos];
a[leftPos] = a[right];
a[right] = temp;
return leftPos;
}