您的位置:首页 > 其它

(二)排序简介:快速排序、选择排序、归并排序、堆排序

2014-09-22 10:37 417 查看
(1)快速排序

void quickSort(int A[], int l, int r)
{
if(l < r)
{
int i = l, j = r, temp = A[l];
while(i < j)
{
while( (i<j) && (A[j]>=temp) )
{
--j;
}
if(i < j)
{
A[i] = A[j];
i++;
}
while( (i<j) && (A[i]<=temp))
{
++i;
}
if(i < j)
{
A[j] = A[i];
j--;
}
}
A[i] = temp;
quickSort(A, l, i-1);
quickSort(A, i+1, r);
}
}

(2)选择排序
void selectSort(int A[], int n)
{
int i, j, k, temp;
for(i=0; i<n-1; i++)
{
j = i;
for(k=i+1; k<n; k++)
{
if(A[k] < A[j])
{
j = k;
}
}
if(j != i)
{
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
(3)归并排序
//将A[first...mid]与A[mid+1...last]进行合并
void mergeArray(int A[], int first, int mid, int last, int temp[])
{
int i = first, m = mid, j = mid + 1, n = last, k = 0;

while((i<=m) && (j<=n))
{
if(A[i] <= A[j])
temp[k++] = A[i++];
else
temp[k++] = A[j++];
}
while(i <= m)
temp[k++] = A[i++];
while(j <= n)
temp[k++] = A[j++];
for(i=0; i<k; i++)
A[first+i] = temp[i];
}

void mergeSort(int A[], int first, int last, int temp[])
{
int mid;
if(first < last)
{
mid=(first + last) / 2;
mergeSort(A, first, mid, temp);
mergeSort(A, mid+1, last, temp);
mergeArray(A, first, mid, last, temp);
}
}
(4)堆排序
//从节点i开始调整, i子女节点为2i+1, 2i+2
void minHeapFixDown(int a[], int n, int i)
{
int j, temp;
temp = a[i];
j = 2 * i + 1;
while( j < n)
{
if( ((j+1)<n) && (a[j+1]<a[j]) ) //在左右孩子中找最小的
j++;
if(a[j] >= temp)
break;
a[i] = a[j]; ////把较小的子结点往上移动,替换它的父结点
i = j;
j = 2 * i + 1;
}
a[i] = temp;
}

//建立最小堆
void buildMinHeap(int a[], int n)
{
int i;
for(i=(n-1)/2; i>=0; i--)
minHeapFixDown(a, n, i);
}

void heapSort(int a[], int n)
{
int i,temp;
for(i=n-1; i>=1; i--)
{
{
temp = a[i];
a[i] = a[0];
a[0] = temp;
}
minHeapFixDown(a, i, 0);
//buildMinHeap(a, i);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐