直接交换排序:
遍历未排序数组,每次找出其中最小值,将其置入已排序的数组中。
code:
void Select(int *a,int n)
{
int temp;
for(int i = 0 ; i < n ; ++i)
{
temp = i;
for(int j = i ; j < n ; ++j)
{
if(a[temp] > a[j])
temp = j;
}
Swap(a[temp],a[i]);
}
}
归并排序:
分治,将一个数字从中切开,分为两个数组,对两个数组进行排序,之后合并。
code:
void mergeArr(int *a,int begin,int mid,int end,int *temp)
{
int i = begin , j = mid + 1;
int m = mid , n = end;
int 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(int i = 0 ; i < k ; ++i)
a[begin + i] = temp[i];
}
void mergeSort(int *a,int begin,int end,int *temp)
{
if(begin < end)
{
int mid = (begin + end) / 2;
mergeSort(a,begin,mid,temp);
mergeSort(a,mid+1,end,temp);
mergeArr(a,begin,mid,end,temp);
}
}
bool merge(int *a,int n)
{
int *p = new int[n];
if(p == NULL)
return false;
mergeSort(a,0,n-1,p);
delete []p;
return true;
}
快排:
1.从数列中取出一个数作为基准
2.将数列中其他数字与其比较,大于该数的数字置于左边,小于该数的数字置于右边。
3.对左右区间重复执行以上过程
每次排序可确定一个数的位置
void quick(int *a,int l,int r)
{
if(l < r)
{
int i = l , j = r , x = a[l];
while(i < j)
{
while(i < j && a[j] >= x)
j--;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] < x)
i++;
if(i<j)
a[j--] = a[i];
}
a[i] = x;
quick(a,l,i-1);
quick(a,i+1,r);
}
}