1.快速排序:先从数列中取出一个数作为基准数;分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;再对左右区间重复第二步,直到各区间只有一个数。
以一个数组作为示例,取区间第一个数为基准数。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;当i=5时,由于i==j退出。此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
/*快速排序*/
#include <iostream>
using namespace std;
const int MAXN = 100;
int n;
void quick_sort(int s[], int left, int right)
{
if(left<right)
{
int pole = s[left];
int i = left;
int j = right;
while(i<j)
{
while(i<j&&s[j]>=pole)//while(i<j&&s[j]<=pole)
{//从后向前寻找可以填前面第i个坑的
j--;
}
s[i] = s[j];//把第j 个填到了前面,第j个空缺
while(i<j&&s[i]<pole)//while(i<j&&s[i]>pole)
{
i++;
}
s[j] = s[i];
}
s[i] = pole;
// for(int k = 0; k<n-1; k++)//输出过程
// printf("%d ",s[k]);
// printf("%d\n",s[n-1]);
quick_sort(s, left, i-1);
quick_sort(s, i+1, right);
}//left == right;
}
int main()
{
int s[MAXN];
scanf("%d",&n);
for(int i = 0; i<n; i++)
{
scanf("%d",&s[i]);
}
quick_sort(s, 0, n-1);
for(int k = 0; k<n-1; k++)
printf("%d ",s[k]);
printf("%d\n",s[n-1]);
return 0;
}
二.交换排序
冒泡排序:冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6,3和4无需交换。5和3交换,变成3,5,4,8,6,3.这样一次冒泡就完了,把最小的数3排到最前面了。对剩下的序列依次冒泡就会得到一个有序序列。冒泡排序的时间复杂度为O(n^2)。
/*冒泡排序*/
#include <iostream>
using namespace std;
const int MAXN = 100;
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void Print(int arr[], int n, int i)
{
printf("%d: ",i);
for(int j = 0; j<n-1; j++)
{
printf("%d ",arr[j]);
}
printf("%d\n",arr[n-1]);
}
void BubbleSort(int arr[], int n)
{
for(int i = 0; i<n-1; i++)//进行n-1次,每一次都会定下一个最小的
{
for(int j = n-1; j>i; j--)
{
if(arr[j]<arr[j-1])
swap(arr, j-1, j);
}
Print(arr, n, i+1);
}
}
int main()
{
int arr[MAXN], n;
scanf("%d",&n);
for(int i = 0; i<n; i++)
{
scanf("%d",&arr[i]);
}
BubbleSort(arr, n);
}
快速排序讲解部分来自:http://blog.csdn.net/morewindows/article/details/6684558讲的很清楚推荐!