标签:
void Bubble_Sort(int arr[],int len)//arr为数组名,len为数组长度
{
int i =0 ;
int j = 0;
for( i=0;i<len-1;i++)
{
for(j=0;j<(len-1-i);j++)//设置无序与有序序列的分割条件 (len-1-i)
{
if(arr[j]>arr[j+1])//前者小于后者
{
int temp=arr[j];//两数交换
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}void Insert_Sort(int arr[],int sz)//sz为数组的长度
{
int i =0 ,j=0;
int temp = 0;
for(i =1 ;i< sz;i++)
{
temp =arr[i];//记录下 要插入到序列中的数
j = i -1;
while(j>=0&& temp<arr[j])//要插入的序列
{
arr[j+1]= arr[j]; //将序列中的数字向后移上一位 直到插入的数大于序列中的数
j--;
}
arr[j+1] = temp;//将要插入的数插到序列中
}
}
时间复杂度。
最好情况:由于希尔排序的好坏和步长d的选择有很多关系,因此,目前还没有得出最好的步长如何选择(现在有些比较好的选择了,但不确定是否是最好的)。所以,不知道最好的情况下的算法时间复杂度。
最坏情况下:O(n*logn),最坏的情况下和平均情况下差不多。
平均情况下:O(n*logn)
void Shell_Sort(int arr[],int len)
{
int d = 0 ;
int i = 0;
int j = 0;
int temp = 0;
d= len/2;
while(d > 0)
{
for(i = d;i< len ;i++)//各组内的插入排序
{
temp =arr[i];
j =i-d;
while(j >= 0 && arr[j] > temp )
{
arr[j+d] = arr[j];
j -=d;
}
arr[j+d] =temp;
}
d=d/2;//递减增量
}
}void Select_Sort(int arr[],int len)//len为数组长度
{
int i = 0;
int j = 0;
int temp= 0;
for(i =0 ;i< len-1;i++)//判断需要几次排序
{
int min =i;//min为最小元素的下标
for(j =i;j< len;j++)//将无序区的最小的数下标的找出来给min
{
if(arr[j] <arr[min])
{
min= j;
}
}
temp= arr[i];//将下标为min的数放到有序区
arr[i]= arr[min];
arr[min] = temp;
}
}2 2 4 9 3 6 7 1 5
首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。
2 2 4 9 3 6 7 1 5 首先比较2和5,5比2大,j左移
2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置
2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面
2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变
经过第一轮的快速排序,元素变为下面的样子
[1] 2 [4 9 3 6 7 5]
之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。
代码实现void Quick_Sort(int arr[],int start,int end)//对数组中的下标为i - j的元素 进行快速排序
{
int temp = arr[start];//temp 表示 记录位
int i = start;
int j = end;
if(start < end)//从两端交替向中间扫描
{
while(i < j)
{
while(i<j && arr[j] >=temp)
{
j--;
}
if(i< j)
{
arr[i]=arr[j];
i++;
}
while(i<j && arr[i]<temp)
{
i++;
}
if(i<j)
{
arr[j]=arr[i];
j--;
}
}
arr[i] = temp;
Quick_Sort(arr,start,i-1);//对左半部分进行递归调用
Quick_Sort(arr,i+1,end);//对右半部分进行递归调用
}
}
如设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11,;
将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
重复步骤2,直到所有元素排序完毕
设有一个初始序列为: R {50, 123, 543, 187, 49, 30, 0, 2, 11, 100}。
我们知道,任何一个阿拉伯数,它的各个位数上的基数都是以0~9来表示的。
所以我们不妨把0~9视为10个桶。
我们先根据序列的个位数的数字来进行分类,将其分到指定的桶中。例如:R[0] = 50,个位数上是0,将这个数存入编号为0的桶中。
分类后,我们在从各个桶中,将这些数按照从编号0到编号9的顺序依次将所有数取出来。
这时,得到的序列就是个位数上呈递增趋势的序列。
按照个位数排序: {50, 30, 0, 100, 11, 2, 123, 543, 187, 49}。
接下来,可以对十位数、百位数也按照这种方法进行排序,最后就能得到排序完成的序列。
标签:
原文地址:http://blog.csdn.net/wx_east/article/details/52202970