<pre name="code" class="cpp">#include<iostream>
#include<algorithm>
using namespace std;
void showInt(int e){
cout<<e<<" ";
}
// 遍历数组
void printArray(int *a,int length){
for_each(a,a+length,showInt);
cout<<endl;
}
//交换值函数
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
/*******************************************************************/
//快速排序的一次划分
int position(int* &a,int left,int right){
int pivot=a[left];//把关键字存起来
while(left<right){
while(left<right && a[right]>=pivot)
right--;
if(left<right) // 如果需要交换,避免本来就是顺序的串产生错误!!!!!
a[left++]=a[right];
while(left<right && a[left]<=pivot)
left++;
if(left<right)
a[right--]=a[left];
}
a[left]=pivot;
return left;
}
//快排
void quickSort(int *a,int left,int right){
int mid;
if(left<right){
mid=position(a,left,right);
quickSort(a,left,mid-1);
quickSort(a,mid+1,right);
}
}
/*******************************************************************/
//归并排序
int* Merge(int* &a,int length,int left,int mid,int right){
int *result=new int[length];
int i=left,j=mid+1;
int count=left;
//result=a;
for(int k=left;k<=right;k++)
result[k]=a[k];
while(i<=mid && j<=right){
if(a[i]<=a[j]){
result[count++]=a[i++];
}
else{
result[count++]=a[j++];
}
}
if(i<=mid){
while(i<=mid)
result[count++]=a[i++];
}
if(j<=right){
while(j<=right)
result[count++]=a[j++];
}
//a=result;
for(int k=left;k<=right;k++)
a[k]=result[k];
return a;
}
void MergeSort(int* a,int length,int left,int right){
if(left<right){
int mid=(left+right)/2;
MergeSort(a,length,left,mid);
MergeSort(a,length,mid+1,right);
a=Merge(a,length,left,mid,right);
}
}
/*******************************************************************/
// 选择排序 :每一次将最小的数放到最前面
void chooseSort(int* &a,int length){
int i,j;
for(i=0;i<length-1;i++){
int k=i;
for( j=i+1;j<length;j++){
if(a[k]>a[j])
k=j;
}
if(k!=i)
swap(a[k],a[i]);
}
}
/*******************************************************************/
//冒泡排序: 每一次将最大的数放到最后面
void maopaoSort(int* &a,int length){
for(int i=0;i<length-1;i++)
for(int j=0;j<length-i-1;j++){
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
}
/*******************************************************************/
/*******************************************************************/
//二分插入排序: 每一次插入第i个元素的时候,通过二分法确定第i个元素在前面i-1个元素的位置
void midSort(int* &a,int length){
for(int i=1;i<length;i++){
int left=0;
int right=i-1;
int temp=a[i]; //取得第i个元素的值
while(left<=right){
int mid=(left+right)/2;
if(a[mid]>temp)
right-=1;
else
left+=1;
}
for(int k=i-1;k>right;k--)
a[k+1]=a[k];
a[right+1]=temp;
printArray(a,10);
}
}
/*******************************************************************/
int main(){
//int a[]={45,65,21,34,55,30,98,79,66,77};
//int a[]={6,8,7,9,0,1,3,2,4,5};
//int a[]={1,4,2,3,0};
//quickSort(a,0,9);
int*a=new int[10];
a[0]=6;
a[1]=8;
a[2]=7;
a[3]=9;
a[4]=0;
a[5]=1;
a[6]=3;
a[7]=2;
a[8]=4;
a[9]=5;
//a={1,2,8,9,3,4,5,6};
printArray(a,10);
//maopaoSort(a,10);
midSort(a,10);
//MergeSort(a,10,0,9);
//quickSort(a,0,9);
printArray(a,10);
system("pause");
return 0;
}
面试基础,快速排序和二分排序c++实现
最新推荐文章于 2021-08-02 22:03:51 发布