排序知识点思维导图
排序代码实现
一、插入排序
1. 直接插入排序
void InsertSort(ElemType A[],int n){
int i,j;
for(i=2;i<=n;i++){
if(A[i]<A[i-1]){
A[0]=A[i];
for(j=i-1;A[0]<A[j];--j)
A[j+1]=A[j];
A[j+1]=A[0];
}
}
2. 折半插入排序
void InsertSort(ElemType A[],int n){
int i,j,low,high,mid;
for(i=2;i<=n;i++){
A[0]=A[i];
low = 1;high = i-1;
while(low<=high){
mid = (low+high)/2;
if(A[mid] > A[0])
high = mid-1;
else
low = mid+1;
}
for(j=i-1;j>=high+1;--j)
A[j+1]=A[j];
A[high+1]=A[0];
}
}
3. 希尔排序
void ShellSort(ElemType A[],int n){
int i,j,dk;
for(dk = n/2;dk>=1;dk/2){
for(i = dk+1;i<=n;++i){
if(A[i]<A[i-dk]){
A[0] = A[i];
for(j = i-dk;j >0 && A[0]<A[j];j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[0];
}
}
}
}
二、交换排序
1. 冒泡排序
void swap(&a,&b){
int temp = a;
a = b;
b = temp;
}
void BubbleSort(ElemType A[],int n){
for(i=0;i<n-1;i++){
bool flag = false;
for(int j = n-1;j>i;j--)
if(A[j-1]>A[j]){
swap(A[j-1],A[j]);
flag = true;
}
if(flag == true)
return;
}
}
2. 快速排序
void QuickSort(ElemType A[],int low,int high){
if(low<high){
int pivotpos = Partition(A,low,high);
QuickSort(A,low,pivotpos-1);
QuickSort(A,pivotpos+1,high);
}
}
int Partition(ElemType A[],int low,int high){
ElemType pivot = A[low];
while(low < high){
while(low < high && A[high] >= pivot)
--hihg;
A[low] = A[high];
while(low < high && A[low] <= pivot)
++low;
A[high]=A[low];
}
A[low] = pivot;
return low;
}
三、选择排序
1. 简单选择排序
void SelectSort(ElemType A[],int n){
for(int i = 0; i <n-1; i++){
int min = i;
for(int j = i+1 ;j < n;j++)
if(A[j]<A[min])
min = j;
if(min != i)
swap(A[i],A[min]);
}
}
2. 堆排序
void BuildMaxHeap(ElemType A[],int len){
for(i = len/2 ; i>0;i--)
AdjustDown(A,i,len);
}
void AdjustDown(ElemType A[],int k,int len){
A[0] = A[k];
for(i = 2*k ;i<=len; i *=2){
if(i<len && A[i]<A[i+1])
i++;
if(A[0] >= A[i])
break;
else{
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void HeapSort(ElemType A[], int len) {
BuildMaxHeap(A, len);
for(int i = len; i > 1; i--){
swap(A[i],A[1]);
AdjustDown(A, 1, i - 1);
}
}
void AdjustUp(ElemType A[],int k){
A[0] = A[k];
int i = k / 2;
while (i > 0 && A[i] < A[0]) {
A[k] = A[i];
k = i;
i = k / 2;
}
A[k] = A[o];
}
四、归并排序
ElemType *B = (ElemType *)malloc(n+1)*sizeof(ElemType));
void Merge(ElemType A[],int low,int mid,int high){
for(int k = low; k <= high; k++)
B[k] = A[k];
for(i = low,j = mid+1,k=i;i<=mid&&j<=high;k++){
if(B[i]<=B[j])
A[k]=B[i++];
else
A[k]=B[j++];
}
while(i<=mid)
A[k++]=B[i++];
while(j<=high)
A[k++]=B[j++];
}
void MergeSort(ElemType A[],int low,int high){
if(low <high){
int mid = (low + high)/2;
MergeSort(A,low,mid);
MergeSort(A,mid+1,high);
Merge(A,low,mid,high);
}
}
合集: 数据结构之线性表 数据结构之栈与队列 数据结构之串 数据结构之树与二叉树 数据结构之图 数据结构之查找 数据结构之排序
|