文章目录

1 选择排序。
思想: 每一次选择一个最大的数或者最小的数放在末尾。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Selectsort(int a[],int n){
int i,j;
for(i=n-1;i>=0;i--){
int Max=a[0],index=0;
for(j=0;j<=i;j++){
if(a[j]>Max){
index=j;
Max=a[j];
}
}
int temp=a[index];
a[index]=a[i];
a[i]=temp;
}
}

2 冒泡排序。
思想:如果相邻的两个数不是递增的,则交换。

1
2
3
4
5
6
7
8
9
10
11
12
void Bunblesort(int a[],int n){
int i,j;
for(i=n-1;i>=0;i--){
for(j=1;j<=i;j++){
if(a[j-1]>a[j]){
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
}

3 插入排序。
思想:对一个已经排好序的序列,插入一个新的数。

1
2
3
4
5
6
7
8
9
10
11
void Insertsort(int a[],int n){
int i,j;
for( i=1;i<n;i++){
int temp=a[i];
for(j=i-1;j>=0;j--){
if(a[j]<=temp)break;
a[j+1]=a[j];
}
a[j+1]=temp;
}
}

4 二路归并排序。
思想:把一个带排序的序列分成两段进行排序,直到这个序列是一个数,然后把已经排序好的两个序列进行合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Mergesort(int a[],int start,int end){
if(start==end)return;
int mid=(start+end)/2;
Mergesort(a,start,mid);
Mergesort(a,mid+1,end);
int temp[Maxn],i=start,j=mid+1,k=0,t;
while(i<=mid&&j<=end){
if(a[i]<=a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
if(i>mid){
while(j<=end)
temp[k++]=a[j++];
}
else if(j>end){
while(i<=mid)
temp[k++]=a[i++];
}
for(t=0;t<k;t++){
a[t+start]=temp[t];
}
}

5 快速排序。
思想:每一次选一个基准,把大于基准的数一道右边,小于基准的数移动到左边,最后的结果就是基准左边都是比它小的数,右边都是比它大的数。然后对于基准左边和右边重复以上操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void quicksort(int *a, int left, int right){
if(left >= right){
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j){
while(i < j && key <= a[j]){
j--;
}
a[i] = a[j];
while(i < j && key >= a[i]){
i++;
}
a[j] = a[i];
}
a[i] = key;
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
文章目录