[排序] 快排 && 冒泡(自己写)

时间:2023-03-09 13:30:00
[排序] 快排 && 冒泡(自己写)
#include <iostream>
using namespace std; /*
快速排序
通过一趟排序,以轴点为界 分割为两部分:左部分 <= 轴点 <= 右部分
再分别对左右两部分继续递归排序
最终整个序列有序
*/
void quickSort(int arr[], int low,int high){ //if (arr==NULL||length<=0||start<=0||end>=length)
//break; int i,key,j;
if (low<high){
key=arr[low];
i=low;
j=high;
while(i<j){ //结束条件是i==j
while(i<j && arr[j]>=key) //从高到低,直到找到第一个<key的元素a[j]
j--;
if(i<j) //这里为什么要再判断一下呢??
arr[i++]=arr[j]; //继续上边,将arr[j]移到a[i]上 while(i<j && arr[i]<=key)
i++;
if(i<j)
arr[j--]=arr[i];
} arr[i]=key;
quickSort(arr,low,i-);
quickSort(arr,i+,high);
}
} void quickSort(int arr[], int low,int high){
//出错预防 //if (arr==NULL||length<=0||start<=0||end>=length)
//break;
int pivot=partition(arr,low,high); //寻找枢轴
quickSort(arr,low,pivot-);
quickSort(arr,pivot+,high);
}*/ void main(){
int a[]={,,,,,};
quickSort(a,,); for(int i=;i<;i++)
cout <<a[i];
}
#include <iostream>
using namespace std; /*冒泡排序******************************************* 一次起泡,最大值通过交换达到最右边
二次起泡,第二大的值达到倒数第二位
……
len-1次起泡 ,基于面试宝典P216 */ //改进版,若在某次起泡过程中没有交换,则说明已经全部有序了,因此这趟排序后就可以终止了
void bubble(int *a, int len){ //对数组传引用,这里形参怎么写更好??
//答:*a 和 a[]都可以
int i,j,tmp,k;
bool tag;
for(k=;k<len;k++){
tag=false; //只执行这个,表示此趟排序没有交换
for (i=;i<len-k;i++){
j=i+;
if (a[i]>a[j]){
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
tag=true; //表示此趟排序有交换
}
}
if (tag==false)
return;
}
}
/*
//基本版
void bubble(int *a, int len){//对数组传引用,这里形参怎么写更好??
//答:*a 和 a[]都可以
int i,j,tmp,k;
for(k=1;k<len;k++){
for (i=0;i<len-k;i++){
j=i+1;
if (a[i]>a[j]){
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
}*/ void main(){
int a[]={,,,,,,,};
/*
int a[10];
cout<<"请输入10个整数:"<<endl;
for(int i=0;i<10;i++)
cin>>a[i];
bubble(a,10); */ bubble(a,); for(int i=;i<;i++)
cout<<a[i]<<'\t';
cout<<endl;
}