1.二分查找
设待排序的记录共8个,排序码分别为28,13,72,85,39,41,6,20. 在前七个记录都已排序的基础上,采用折半插入第八个记录的过程如下:
(A) [6 13 28 39 41 72 85] (20)
l=1 m=4 r=7
20<39, m-1=3=r
(B) [6 13 28] 39 41 72 85 (20)
l=1 m=2 r=3
20>13, m+1=3=l
(C) 6 13 [28] 39 41 72 85 (20)
l=m=r=3
20<28, m-1=2=r
l>r,二分法结束,l=3为插入位置
(D) 6 13 (20) 28 39 41 72 85
1.插入排序之二分查找排序#region 1.插入排序之二分查找排序
int fun(int *num,int l,int h,int x)
{
int mid;
while(l<=h)
{
mid=(l+h)/2;
if(num[mid]<x && x<=num[mid+1])
return (mid+1);
else if(num[mid]<x)
l=mid+1;
else
h=mid-1;
}
return h;
}
void sort(int *num,int n)/**//*二分排序*/
{
int i,j,t,x;
for(i=1;i<n;i++)
{
x=num[i];
if(num[i]<num[0])
t=0;
else
t=fun(num,0,i,x);
for(j=i;j>t;j--)
num[j]=num[j-1];
num[t]=x;
}
}
void main()
{
int num[10],i;
clrscr();
printf("please input 10 num: ");
for(i=0;i<10;i++)
scanf("%d",&num[i]);
sort(num,10);
for(i=0;i<10;i++)
printf("%6d",num[i]);
getch();
}
#endregion
2、排序算法
冒泡排序:这是最原始,也是众所周知的最慢的算法了。倒序(最糟情况)
第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:6次
冒泡排序算法#region 冒泡排序算法
using System;
namespace BubbleSorter
{
public class BubbleSorter
{
public void Sort(int [] list)
{
int i,j,temp;
bool done=false;
j=1;
while((j<list.Length)&&(!done))
{
done=true;
for(i=0;i<list.Length-j;i++)
{
if(list[i]>list[i+1])
{
done=false;
temp=list[i];
list[i]=list[i+1];
list[i+1]=temp;
}
}
j++;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
BubbleSorter sh=new BubbleSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
#endregion
选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
初始关键字 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [49 97 65 76]
第五趟排序后 13 27 38 49 49 [97 97 76]
第六趟排序后 13 27 38 49 49 76 [76 97]
第七趟排序后 13 27 38 49 49 76 76 [ 97]
最后排序结果 13 27 38 49 49 76 76 97
选择排序算法#region 选择排序算法
using System;
namespace SelectionSorter
{
public class SelectionSorter
{
private int min;
public void Sort(int [] list)
{
for(int i=0;i<list.Length-1;i++)
{
min=i;
for(int j=i+1;j<list.Length;j++)
{
if(list[j]<list[min])
min=j;
}
int t=list[min];
list[min]=list[i];
list[i]=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47};
SelectionSorter ss=new SelectionSorter();
ss.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
#endregion
直接插入排序(straight insertion sort)的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
初始序列:
i=1 [46] 58 15 45 90 18 10 62
↓
i=2 [46 58] 15 45 90 18 10 62
┌——┘
↓
i=3 [15 46 58] 45 90 18 10 62
┌——┘
↓
i=4 [15 45 46 58] 90 18 10 62
↓
i=5 [15 45 46 58 90] 18 10 62
┌—————┘
↓
i=6 [15 18 45 46 58 90] 10 62
┌————————┘
↓
i=7 [10 15 18 45 46 58 90] 62
┌—┘
↓
i=8 [10 15 18 45 46 58 62 90]
插入排序算法#region 插入排序算法
using System;
namespace InsertionSorter
{
public class InsertionSorter
{
public void Sort(int [] list)
{
for(int i=1;i<list.Length;i++)
{
int t=list[i];
int j=i;
while((j>0)&&(list[j-1]>t))
{
list[j]=list[j-1];
--j;
}
list[j]=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47};
InsertionSorter ii=new InsertionSorter();
ii.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0}",iArrary[m]);
Console.WriteLine();
}
}
}
#endregion
希尔排序(缩小增量法) :属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序 初始:d=5
49 38 65 97 76 13 27 49* 55 04
|----------------------------|
38 27
|---------------------------|
65 49*
|----------------------------|
97 55
|--------------------------|
76 04
|-----------------------------|
一趟结果
13 27 49* 55 04 49 38 65 97 76
d=3
13 27 49* 55 04 49 38 65 97 76
|---------------|----------------|--------------------|
27 04 65
|----------------|----------------|
49* 49 97
|----------------|-----------------|
二趟结果
13 04 49* 38 27 49 66 65 97 76
d=1
13 04 49* 38 27 49 66 65 97 76
|-----|-----|-----|-----|-----|-----|-----|-----|-----|
三趟结果
04 13 27 38 49* 49 55 65 76 97
希尔排序#region 希尔排序
using System;
namespace ShellSorter
{
public class ShellSorter
{
public void Sort(int [] list)
{
int inc;
for(inc=1;inc<=list.Length/9;inc=3*inc+1);
for(;inc>0;inc/=3)
{
for(int i=inc+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1];
j-=inc;
}
list[j-1]=t;
}
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
ShellSorter sh=new ShellSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
#endregion
3.
.求n个数中m个数的全排列
#region
int j=0,k,num=0;
fun1(int a[],int ii,int n,int m)
{int i,jj;
jj=j;
for(i=ii;i<=n;i++)
{
j=jj;
if(j==m)
break;
else if(j+1==m-1)
{
num++;
j++;
a[j]=i;
for(k=0;k<=j;k++)
printf("%3d",a[k]);
printf(" ");
}
else
{
j++;
a[j]=i;
fun1(a,i+1,n,m);
}
}
}
fun(int n,int m)
{int i,a[100];
printf(" ");
for(i=1;i<=n-m+1;i++)
{
j=0;
a[j]=i;
fun1(a,i+1,n,m);
}
printf("there are %d way ",num);
}
main()
{int n,m;
clrscr();
printf("please input n: ");
scanf("%d",&n);
printf("please input m: ");
scanf("%d",&m);
fun(n,m);
getch();
}
#endregion