常用的排序算法有冒泡排序,选择排序,插入排序,归并排序、希尔排序,堆排序等1、冒泡
冒泡排序就是像旗袍一样,最大的值逐渐上浮,我的实现方法是采用递归的,当然也可以不用递归
void bubbleSort2(int array[],int length)
{
if(length==1)
return;
int index=0;
for(int i=0;i<length;i++)
{
if(array[i]>array[index])
index=i;
}
if(index!=length-1)
{
int temp=array[index];
array[index]=array[length-1];
array[length-1]=temp;
}
bubbleSort2(array,length-1);
}
2,插入排序:插入排序将整个序列分成两个部分,有序区和无序区,我们要做的工作就是依次地把无序区的值插入到有序区中去
当然首先先从第一个元素开始,假设第一个元素是有序区
void InsertSort(int array[],int length)
{
int index=0;
for(int i=1;i<length;i++)
{
int temp=array[i];
int j=i-1;
while(j>=0 && array[j]>temp){
array[j+1]=array[j];
j--;
}
array[j+1]=temp;
}
}
3、选择排序
选择排序的思想是选取无序区的最大值放在有序区的末尾
void selectionSort(int array[],int length)
{
int index=0;
while(index<length){
int min=index;
for(int i=index+1;i<length;i++)
{
if(array[i]<array[min])
{
min=i;
}
}
if(min!=index)
{
int temp=array[min];
array[min]=array[index];
array[index]=temp;
}
index++;
}
}
4,shell排序
shell排序的基本思想是给出一个增量gap,每个元素只跟他距离gap的元素比较,这样就可以一次跳过多个元素进行比价
void shellSort2(int array[],int length)
{
int gap=length/2;
while(gap>0)
{
for(int i=gap;i<length;i++)
{
int temp=array[i];
int j=i-gap;
while(j>=0 && array[j]>temp)
{
array[j+gap]=array[j];
j-=gap;
}
array[j+gap]=temp;
}
gap/=2;
}
}
5,归并排序,归并排序就是对两个已经排好序的序列合并排序,以数组为例,首先把数组分成左右两个已经排好序的数组,会后进行归并
//merge作为mergesort的辅助函数
void merge(int a[], int p, int q, int r)//p-r是一个序列,r到q是一个序列
{
int n1=r-p+1, n2=q-r;
//int L[n1],R[n2];
int* L = new int[n1];
int* R = new int[n2];
//下面两个for循环是分成左右两个数组,然后归并
for(int i=0;i<n1;i++)
{
L[i] = a[p+i];
}
for(int j=0;j<n2;j++)
{
R[j] = a[r+j+1];
}
int i=0,j=0;
for(int k=p; k<=q;k++)
{
//下面就是交换的过程
if(i<n1 && j<n2)
{
if(L[i]<R[j])
{
a[k] = L[i];
i++;
}
else
{
a[k] = R[j];
j++;
}
}
else if(i<n1)
{
a[k] = L[i];
i++;
}
else
{
a[k] = R[j];
j++;
}
}
}
void mergeSort(int a[],int start, int end)
{
if(start < end)
{
int r=(end + start)/2;
mergeSort(a, start, r);
mergeSort(a, r+1, end);
merge(a,start, end, r);
}
}