排序
冒泡排序

算法步骤
- 从开始第一对到结尾的最后一对,比较相邻的元素,如果第一个>第二个则交换。
- 一轮结束后最大的数会排到最后,然后排除最大/最后的数接着冒泡前面的数,例二轮会把最大(第二大)的数排到最后
e.g.
1 3 5 7 9 2 4 6 8 10
第一轮
(1)1 3 5 7 2 9 4 6 8 10 #9>2
(2)1 3 5 7 2 4 9 6 8 10 #9>4
(3)1 3 5 7 2 4 6 9 8 10 #9>6
(4)1 3 5 7 2 4 6 8 9 10 #9>8
(5)1 3 5 7 2 4 6 8 9 10 #9<10 第二轮以此类推知道排成1 2 3 4 5 6 7 8 9 10为止
基本代码
#include<stdio.h>//基本代码
int main(){
int n,a[1000];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
优化代码
#include <stdio.h>//优化代码
int main(){
int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
int i, j, temp, isSorted;
//优化算法:最多进行 n-1 轮比较
for(i=0; i<10-1; i++){
isSorted = 1; //假设剩下的元素已经排序好了
for(j=0; j<10-1-i; j++){
if(nums[j] > nums[j+1]){
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
isSorted = 0; //一旦需要交换数组元素,就说明剩下的元素没有排序好
}
}
if(isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了
}
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf("\n");
return 0;
}
字符串冒泡
#include <stdio.h>
#include <string.h>
int main()
{
int n=0,i=0;
char a[100][100];
while(scanf("%s",&a[i])!=EOF)i++;
for(int j=0;j<i-1;j++){
for(int k=0;k<i-j-1;k++){
if(strcmp(a[k],a[k+1])>0){
char t[100];
strcpy(t,a[k]);
strcpy(a[k],a[k+1]);
strcpy(a[k+1],t);
}
}
}
for(int j=0;j<i;j++)
printf("%s",a[j]);
return 0;
}
快速排序
步骤
- 从数组中选一个元素作为基准数
- 分区,比基准数大的放右边,小的放左边
- 再对两边重复分区
#include<stdio.h>
void quicksort(int *a,int low,int high);
int main()
{
int arr[12];
for(int k=0;k<10;k++)
scanf("%d",&arr[k]);
quicksort(arr,0,9);
for(int k=0;k<10;k++)
printf("%d ",arr[k]);
return 0;
}
void quicksort(int *a,int low,int high){
if(low<high){
int i=low;
int j=high;
int num=a[i];
while(i<j){
while(i<j&&a[j]>=num)j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<num)i++;
if(i<j)
a[j--]=a[i];
}
a[i]=num;//i==j
//递归
quicksort(a,low,i-1);//排左边
quicksort(a,i+1,high);//排右边
return;
}
}

浙公网安备 33010602011771号