十大排序算法
do{
while(i<right && pData[i]<middle)
i++;
while(j>left && pData[j]>middle)
j--;
if(i>=j)
break;
temp = pData[i];
pData[i] = pData[j];
pData[j] = temp;
i++;
j--;
二算法实现
常言道光说不练假把式,这里肯定要把实现代码贴出来了。
1选择排序
void selectsort(int *pData,int left,int right)
{
int i,j,temp;
int tb;
for(i=left;i<right-1;i++)
{
temp = i;
for(j=i+1;j<right;j++)
希尔排序算法时间复杂度O(n2)。
5快速排序
快速排序利用分治的思想,在数组中设置一个游标,从数组的两端来遍历数组,将元素和游标相比,意图达到两组数据一边游标小,一边比游标大。那么此时的游标就处于两组数组的中间。然后依次对前后两组数据排序,此时当然可以利用递归了。时间平均复杂度是O(n*logn),排序算法貌似是公认最实用最好的排序算法,在大多数情况下都能解决问题,提高效率,当然也有糟糕的时候,此时的算法时间复杂度达到O(n2)。
if(right>j+1)
quicksort(pData,j+1,right);
}
(2)游标为中间元素
void quicksort2(int *pData,int left,int right)
{
int i,j,middle,temp;
i = left;
j = right - 1;
middle = pData[(i + j)/2];
if(left<i)
quicksort3(pData,left,i+1);
if(right>i+3)
quicksort3(pData,i+2,right);
}
6归并排序
(1)递归法实现
void mergesort2(int *pData,int *Des,int left,int right)
{
int first = left;
}
}
}
}
3插入排序
void insertsort(int *pData,int left,int right)
{
int i,j;
int temp;
for(i=left+1;i<right;i++)
{
temp = pData[i];
j = i;
while(--j>=left && pData[j]>temp)
{
temp = pData[i];
for(j=i-gap;(j>=0)&&pData[j]>temp;j-=gap)
{
pData[j+gap] = pData[j];
}
pData[j+gap] = temp;
}
}
}
5快速排序三种实现方式
(1)游标为最左边元素
void quicksort(int *pData,int left,int right)
Des[k++] = pData[i++];
else
Des[k++] = pData[j++];
}
while(i<=mid)
{
Des[k++] = pData[i++];
}
while(j<=last)
{
Des[k++] = pData[j++];
}
for(k=first;k<=last;k++)
pData[k] = Des[k];
right_max = left_max + i;
if (right_max > length)
right_max = length;
next = 0;
while (left_min < left_max && right_min < right_max)
tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];
break;
temp = pData[i];
pData[i] = pData[j];
pData[j] = temp;
i++;
j--;
}while(i<=j);
pData[left] = pData[j];
pData[j] = middle;
if(left<j-1)
quicksort(pData,left,j);
{
int i,j;
int temp;
for(i=left;i<right-1;i++)
{
for(j=left;j<right-i-1;j++)
{
if(pData[j+1]<pData[j])
{
temp = pData[j+1];
pData[j+1] = pData[j];
pData[j] = temp;
while (left_min < left_max)
list[--right_min] = list[--left_max];
9计数排序
计数排序的思想也很简单,就是针对所有的整数。取一个从最小值到最大值的间隔,然后遍历数组,把当前元素放在下标为(当前元素值-最小值)的位置。是不是很简单啊,编程玩的就是思想,没有思想的程序员就不是真正的程序员。
10桶排序
说到最后最后终于说到桶排序了。桶排序的思想就是先把数据分成一个个分组,这一个个分组就是一个个桶,当然这些桶是有顺序的,要不然桶排序作为非比较排序算法,连唯一的顺序都没有并且也不比较还排什么序啊。对于首次分桶后的数据可以采用递归或者其他的排序算法实现对每个桶内数据排序。最后按照桶号将所有数据依次连接就是拍完顺序的数据了。
}
(2)非递归法实现
void mergesort3(int *list,int length)
{
int i, left_min, left_max, right_min, right_max, next;
int *tmp = (int*)malloc(sizeof(int) * length);
if (tmp == NULL)
4希尔排序
希尔排序的思想就是:希尔排序是对插入排序的改进,可以把当前数据分组,每个分组都有一定间隔,比如说原来数组的小标范围是0,1,2,3,4,5,6,7,8,9.我们把它们分成两组,0-4一组,5-9一组,这样的话,间隔就是5,我们令0,5,;1,6;2,7;3,8;4,9,它们两两比较大小。然后再减小间隔范围,或者说增多分组个数,比如此时,间隔为2,那么比较下标为0,2,4,6,8的大小,然后比较下标为1,3,5,7,9的大小。到最后间隔变为1,就变成了完全的插入排序了。
{
pData[j+1] = pData[j];
}
pData[j+1] =temp;
}
}
4希尔排序
void shellsort(int *pData,int left,int right)
{
int i,j,gap;
int temp;
for(gap=right/2;gap>0;gap/=2)
{
for(i=gap;i<right;i++)
}
}
void merges(int *pData,int *Des,int first,int mid,int last)
{
int i = first;
int j = mid + 1;
int k = first;
while(i<=mid&&j<=last)
{
if(pData[i]<pData[j])
{
fputs("Error: out of memory\n", stderr);
abort();
}
for (i = 1; i < length; i *= 2)
for (left_min = 0; left_min < length - i; left_min = right_max)
{
right_min = left_max = left_min + i;
十大排序算法
自己根据算法思想,自己编程实现十大排序算法,当然其中也有借鉴别人的地方,所有的程序都是自己经过检验测试没有问题才放出来的。
一算法介绍
1选择排序
选择排序的思想就是:从当前数中选出一个最大或者最小的值排在最前面,然后从剩下的数中选出剩下数的最值排在已经排序的数的后面,算法时间复杂度O(n2),在实际工作中这种排序算法不可取。
int last = right-1;