(二)排序简介:快速排序、选择排序、归并排序、堆排序
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);
}
}
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);
}
}
相关文章推荐
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 排序算法(堆排序,归并排序,快速排序、选择排序、直接插入排序)
- 冒泡排序,快速排序,归并排序,选择排序,插入排序,堆排序
- 排序总结:插入(简单和改进)、希尔、选择、冒泡、快速、堆排序、归并排序
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 内排序(插入排序、冒泡排序、选择排序、shell排序、快速排序、归并排序、堆排序)
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)