1.快速排序
.快速排序(对冒泡排序的改进)
设要排序的数组是A[0],...,A[N-1],首先任意选取一个数据(通常选用第一个数)作为关键数据;然后把所有比它小的数都放到它前面,所有比它大的数都放在它后面,这样实现了一趟快速排序。
算法步骤:
1) 设置两个变量i,j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3) 从j开始向前搜索(j=j-1),找到第一个比key小的值A[j],并与A[i]交换;
4)从i开始向后搜索(i=i+1),找到第一个比key大的值A[i],并与A[j]交换;
5)重复3,4,5,直到i=j
#include "stdafx.h"
//快速排序
int Partition(int data[], int start, int end)
{
int X= data[start]; //把第一个元素作为支点
while(start < end)
{
//从后向前
while(start<end && data[end]>=X) end--;
data[start] = data[end];
//从前向后
while(start<end && data[start]<=X) start++;
data[end] = data[start];
data[start] = X;
}
return start;
}
void QuickSort(int data[], int start, int end)
{
if(start == end)
return;
int index = Partition(data,start,end);
if(index >start)
QuickSort(data, start, index-1);
if(index < end)
QuickSort(data, index+1, end);
}
void print(int data[], int length)
{
for(int i = 0; i < length; i++)
printf("%d ", data[i]);
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
int data[]={72,6,57,88,60,42,83,73,48,85};
print(data,sizeof(data)/sizeof(int));
QuickSort(data,0,sizeof(data)/sizeof(int)-1);
print(data,sizeof(data)/sizeof(int));
return 0;
}
2.归并排序
#include "stdafx.h"
void merge_sort(int* A, int x, int y, int* T)
{
if(y-x > 1)
{
int m = x + (y-x) /2; //划分
int p = x, q = m, i = x;
merge_sort(A, x, m, T); //递归
merge_sort(A, m, y, T);
while(p < m || q < y)
{
if(q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];
else T[i++] = A[q++];
}
for(i = x; i < y; i++) A[i] = T[i];
}
}
//归并排序2(P284)
//归并操作
void Merge1(int SR[], int TR[], int i, int m, int n) {
//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
int j,k;
for(j = m + 1, k = i; i <= m && j <=n; ++k)
if(SR[i] < SR[j])
TR[k] = SR[i++];
else
TR[k] = SR[j++];
while(i<=m)
TR[k] = SR[i++];
while(j<=n)
TR[k] = SR[j++];
}
void Merge2(int SR[], int TR[], int i, int m, int n) {
//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
int j,k=n,s;
for(s=m,j=n; s >=i && j>=m+1;k--)
if(SR[i] < SR[j])
TR[k] = SR[j--];
else
TR[k] = SR[s--];
while(j>= m+1)
TR[k--] = SR[j--];
while(s>=i)
TR[k--] = SR[s--];
}
void MSort(int SR[], int TR1[], int s, int t)
{
int m;
int TR2[100];
if(s == t)
{
TR1[s] = SR[s];
return;
}
m = (s+t)/2; //将SR[s..t]平分为SR[s..m]和SR[m+1,..t]
MSort(SR, TR2,s,m); //递归地将SR[s..m]归并为有序的TR2[s..m]
MSort(SR, TR2,m+1,t); //递归地将SR[m+1..t]归并为有序的TR2[m+1,t]
Merge2(TR2,TR1,s,m,t); //将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]
return;
}
int A[] = { 1,0,2,3,9,7};
int n = sizeof(A)/sizeof(int);
int T[100];
void Test1()
{
merge_sort(A,0,6,T);
for(int i = 0; i < n; i++)
printf("%d ", A[i]);
printf("\n");
}
void Test2()
{
int SR[] = {38,49,65,97,13,27,76}; //[0,3][4,6]
int TR[100];
Merge2(SR, TR, 0, 3,6) ;
for(int i=0; i <7; i++)
printf("%d ", TR[i]);
printf("\n");
}
//归并排序
void Test3()
{
int SR[] = {49, 38, 65, 97, 96, 13, 27};
int TR[100];
MSort(SR,TR,0,6);
for(int i=0; i <7; i++)
printf("%d ", TR[i]);
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
//Test2();
Test3();
return 0;
}
3.冒泡排序
//冒泡排序
#include "stdafx.h"
void bubble_sort(int a[], int n)
{
bool change;
for(int i = n -1, change = true; i >= 1 && change; --i)
{
change = false;
for(int j = 0; j < i; ++j)
if(a[j] > a[j+1])
{
int tmp;
tmp =a[j];
a[j] = a[j+1];
a[j+1] = tmp;
change = true;
}
}
}
void print(int a[],int n)
{
for(int i=0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {4,5,3,2};
print(a,4);
bubble_sort(a, 4);
print(a,4);
return 0;
}