标签:
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