您的位置:首页 > 编程语言 > C语言/C++

c语言 排序

2016-08-21 20:55 148 查看
// exam3.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include<iostream>

#include<assert.h>

using namespace std;

//遍历数组

void PrintArr(int *a,int n)

{
for(int i =0;i<n;i++)
{
cout<<a[i]<<" ";

}
cout<<endl;

}

/*排序*/

//1、插入排序

void InsertSort(int *a,int n)//插入排序

{
int i;
int j;
int temp=0;
int flag=0;
for(i=1;i<n;i++)//从第二个数据开始,直到最后一个数据
{
temp=a[i];//第i个数据
for(j=i-1;j>=0;j--)
{
if(temp<a[j])//如果比当前数据小,则当前数据向后移动一个;否则插入当前数据的后面
{
a[j+1]=a[j];

}
else
break;
}
a[j+1]=temp;

}

}

//2.1、冒泡排序

void swap(int& a,int& b)

{
int temp;
temp=a;
a=b;
b=temp;

}

void BubbleSort(int array[],int len)

{
int i,j;
for(i=0;i<len-1;++i) //第i轮中(i从0到len-2),每次将当前最小的数字放在i位置
{
for(j=len-1;j>i;--j)//j从len-1开始(从后往前),到i+1(j>i)结束;
{
if(array[j]<array[j-1])//if(array[j]>array[j-1])
{
swap(array[j],array[j-1]);
}
}
}

}

//2.2、如何进行双向冒泡排序

void Bubble2Sort(int array[],int length)

{
int left = 1;
int right = length-1;

}

//3、进行选择排序

void SelectSort(int *a,int n)

{
int i;
int j;
int temp=0;
int flag=0;
for(i=0;i<n-1;i++)//需要经过n-1轮排序
{
temp=a[i];//第i轮排序从第i个数字开始
flag=i;//设定第i轮的初始最小值为第i个数和a[i]
for(j=i+1;j<n;j++)//第i轮次的排序从第i个数字逐渐开始
{
if(a[j]<temp)
{
temp=a[j];//如果当前数字是最小的值,记下当前的最小值temp及其位置falg
flag=j;
}
}
if(flag!=i)//经过上面的交换后,如果当前的最小值还是初始值,则不用交换,否则还需要继续交换
{
a[flag]=a[i];
a[i]=temp;
}
}

}

//4、希尔排序

void ShellSort(int array[],int length)//希尔排序

{
int i;
int j;
int h;
int temp;
for(h=length/2;h>0;h=h/2)//步长逐渐变小,且每一次的步长是上一次的一半
{
for(i=h;i<length;i++)
{
temp=array[i];//根据步长,将数字分为若干组,每一组的第一个数字为array[i]
for(j=i-h;j>=0;j-=h)
{
if(temp<array[j])//如果后面的数字比前面的数字小
{
array[j+h]=array[j];//j是当前的位置,是前面的;将后面的j+h数字改为j的位置
}
else
break;
}
array[j+h]=temp;//如果执行break语句,表示将temp的语句放回原来的位置,不改变顺序;如果不是执行break语句,表示将数字大的值移动到左边的位置
}

}

}

//5、快速排序

void Sort(int array[],int low,int high)

{
int i,j;
int index;
if(low>=high)
{
return;
}
i=low;
j=high;
index=array[i];
while(i<j)//如果左边i指向的位置与右边j指向的位置重合,则停止,否则重新开始
{
while(i<j && array[j]>=index)//从最右边开始,如果最右边的数大于当前的index,则右边的指针j向左移动一个位置;直到当前j指向的数字小于index的时候为止
j--;//当while 循环结束后,当前j指向的数是小于index的
if(i<j)
{
array[i]=array[j];//由于当前的j指向的值小于index,(当前i指向的值就是index)需要将当前j指向的值向左移动到当前i指向的位置;
i++;//当前i指向的位置向后移动一个
}
whil
4000
e(i<j && array[i]<index)//如果当前i指向的值小于index,则i指向的位置向右移动一个位置
i++;
if(i<j)
{
array[j]=array[i];
j--;
}
}
array[i]=index;
Sort(array,low,i-1);
Sort(array,i+1,high);

}

void QuickSort(int array[],int len)

{
Sort(array,0,len-1);

}

//6、归并排序

void Merge(int array[],int p,int q,int r)

{
int i,j,k,n1,n2;
n1=q-p+1;//左边数组的个数
n2=r-q;//右边数组的个数
int* L=new int[n1];
int* R=new int[n2];
for(i=0,k=p;i<n1;i++)//左边的数组
{
L[i]=array[k];
k++;
}
for(i=0,k=q+1;i<n2;i++)//右边的数组
{
R[i]=array[k];
k++;
}
//将右边的数组插入到左边的数组
for(k=p,i=0,j=0;i<n1&&j<n2;k++)
{
if(L[i]>R[j])
{
array[k]=R[j];
j++;

}
else
{
array[k]=L[i];

i++;
}

}
//判断数字是否用完
if(i<n1)//左边还有数字
{
for(j=i;j<n1;k++)
{
array[k]=L[j];
j++;
}
}
if(j<n2)//左边还有数字
{
for(i=j;i<n2;k++)
{
array[k]=R[i];
i++;
}
}
delete[] L;
delete[] R;

}

void MergeSort(int array[],int p,int r)//冒泡排序

{
if(p<r)
{
int q =(p+r)/2;
MergeSort(array,p,q);
MergeSort(array,q+1,r);
Merge(array,p,q,r);
}

}

//7、堆排序

void AjustMinHeap(int *a,int pos,int len)

{
int temp;
int child;
for(temp=a[pos];2*pos+1<=len;pos=child)
{
child = 2*pos+1;
if(child<len&&a[child]>a[child+1])
child++;
if(a[child]<temp)
a[pos]=a[child];
else
break;
}
a[pos]=temp;

}

void swap_swap(int& a,int& b)

{
int temp;
temp =a;
a=b;
b=temp;

}

int _tmain(int argc, _TCHAR* argv[])

{
 
int a[]={5,4,9,8,7,6,0,1,3,2};
int len = sizeof(a)/sizeof(a[0]);

InsertSort(a,len);
cout<<"插入排序结果为:";
PrintArr(a,len);

int b[]={5,4,9,8,7,6,0,1,3,2};
BubbleSort(b,len);
cout<<"冒泡排序结果为:";
PrintArr(b,len);

int c[]={5,4,9,8,7,6,0,1,3,2};
SelectSort(c,len);
cout<<"选择排序结果为:";
PrintArr(c,len);

int d[]={5,4,9,8,7,6,0,1,3,2};
ShellSort(d,len);
cout<<"希尔排序结果为:";
PrintArr(d,len);

int e[]={5,4,9,8,7,6,0,1,3,2};
QuickSort(e,len);
cout<<"快速排序结果为:";
PrintArr(d,len);

int f[]={5,4,9,8,7,6,0,1,3,2};
MergeSort(f,0,len-1);
cout<<"归并排序结果为:";
PrintArr(f,len);
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息