数据结构©
一、排序算法
1.插入排序
直接插入排序
void InsertSort(int *p,int n){
int i,j,temp;
for(i=1;i<n;i++){
if(p[i]<p[i-1]){
temp = p[i];
for(j=i-1;j>=0&&p[j]>temp;j--){
p[j+1]=p[j];
}
p[j+1]=temp;
}
}
}
折半插入排序
void InsertSort(int *p,int n){
int i,j,low,high,mid,temp;
for(i=1;i<n;i++){
temp =p[i];
low=0;
high=i-1;
while(low<=high){
mid=(low+high)/2;
if(p[mid]>temp)
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=low;j--)
p[j+1]=p[j];
p[low] = temp;
}
}
希尔排序
void ShellSort(int *p , int n){
int d,i,j,temp;
for(d=n/2;d>=1;d=d/2){
for(i=d;i<n;i++){
if(p[i]<p[i-d]){
temp =p[i];
for(j=i-d;j>=0&&p[j]>temp;j-=d)
p[j+d]=p[j];
p[j+d]=temp;
}
}
}
}
2.交换排序
冒泡排序
void BubbleSort(int *p,int n){
int i,j,temp,flag;
for(i=0;i<n-1;i++){
flag =0;
for(j =n-1;j>i;j--){
if(p[j]<p[j-1]){
temp =p[j];
p[j]=p[j-1];
p[j-1]=temp;
flag = 1;
}
}
if(flag == 0)
return;
}
}
void BubbleSort(int *p,int n){
int i,j,temp,flag;
for( i=0;i<n-1;i++){
flag = 0;
for(j=0;j<n-1-i;j++){
if(p[j]>p[j+1]){
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
flag=1;
}
}
if(flag == 0)
return;
}
}
快速排序(内部排序中,最优秀的)
void QuickSort(int *p,int low,int high){
int Partition(int *p,int low,int high);
if(low<high){
int pivotpos = Partition(p,low,high);
QuickSort(p,low,pivotpos-1);
QuickSort(p,pivotpos+1,high);
}
}
int Partition(int *p,int low,int high){
int pivot =p[low];
while(low<high){
while(low<high && p[high]>=pivot)
high--;
p[low] = p[high];
while(low<high && p[low]<=pivot)
low++;
p[high]=p[low];
}
p[low]=pivot;
return low;
}
3.选择排序
简单选择排序
void SelectSort(int *p,int n){
int min,temp,i,j;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++){
if(p[j]<p[min])
min=j;
}
if(min != i){
temp =p[min];
p[min]=p[i];
p[i]=temp;
}
}
}
堆排序
void HeapSort(int *p,int len){
int temp,i;
void HeadAdjust(int *p,int k,int len);
void BuildMaxHeap(int *p,int len);
BuildMaxHeap(p,len);
for(i=len;i>1;i--){
temp =p[i-1];
p[i-1]=p[0];
p[0]=temp;
HeadAdjust(p,1,i-1);
}
}
void HeadAdjust(int *p,int k,int len){
int i,temp;
temp=p[k-1];
for(i=2*k;i<=len;i*=2){
if(i<len && p[i]>p[i-1])
i++;
if(p[i-1]<temp)
break;
else{
p[k-1]=p[i-1];
k=i;
}
}
p[k-1]=temp;
}
void BuildMaxHeap(int *p,int len){
int i;
for(i=len/2;i>0;i--)
HeadAdjust(p,i,len);
}
4.归并排序
void Merge(int *p,int low,int mid,int high){
int i,j,k,*b;
b=(int *)malloc((high+1)*sizeof(int));
for(k=low;k<=high;k++)
b[k]=p[k];
for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
if(b[i]<=b[j])
p[k]=b[i++];
else
p[k]=b[j++];
}
while(i<=mid)
p[k++]=b[i++];
while(j<=high)
p[k++]=b[j++];
}
void MergeSort(int *p,int low,int high){
if(low<high){
int mid;
mid = (low+high)/2;
MergeSort(p,low,mid);
MergeSort(p,mid+1,high);
Merge(p,low,mid,high);
}
}
5.基数排序
6.多路归并排序