三个基础排序的排序方式均是矩阵扫描排序(用到双重循环),因此时间度均为O(n2),空间复杂度均为O(1),都是原地排序
冒泡排序:
双重同向循环直接比较大小并交换
java语言代码实现:
public class sort00 {
public static void main(String[] args) {
int[] a={3,5,9,1,8,4,2};
show(a);
System.out.println(" ");
int[] b=sort(a);
show(b);
}
public static int[] sort(int[] a){
for(int i=a.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(a[j]<a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
return a;
}
public static void show(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
运行结果如下:
C语言对冒泡排序的代码实现:
#include<stdio.h>
void sort(int a[],int b);
void main(){
int i;
int a[]={3,5,9,6,2,8,7};
printf("排序之前:");
for(i=0;i<7;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("排序后:");
sort(a,7);
}
void sort(int a[],int b){
int i,j,temp;
for(i=b-1;i>0;i--){
for(j=0;j<i;j++){
if(a[j]>a[j+1]){//直接比较
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(i=0;i<b;i++){
printf("%d ",a[i]);
}
}
运行结果如下:
选择排序:
双重同向循环比较大小下标利用下标交换。
注:由于在比较中主要关注和替换的是下标及其对应的元素,因此相对于冒泡和插入,此排序不稳定。
java语言实现:
public class sort01 {
public static void main(String[] args) {
int[] a={0,3,5,9,1,7,8,4,2};
System.out.println("排序前:");
show(a);
System.out.println(" ");
int[] b=sort(a);
System.out.println("排序后");
show(b);
}
public static int[] sort(int[] a){
for (int i = 0; i < a.length - 1; i++) {
int mindex=i;
for (int j = i+1; j <a.length ; j++) {
if(a[mindex]>a[j]){
mindex=j;//标记下标
}
}
int temp=a[i];//替换下标元素
a[i]=a[mindex];
a[mindex]=temp;
}
return a;
}
public static void show(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
运行结果如下:
以下是C语言代码实现:
#include<stdio.h>
void sort(int a[],int b);
void main(){
int i;
int a[]={3,5,9,6,2,8,7};
printf("排序前:");
for(i=0;i<7;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("排序后:");
sort(a,7);
}
void sort(int a[],int b){
int i,j,temp,mindex;
for(i=0;i<b-1;i++){
mindex=i;
for(j=i+1;j<b;j++){
if(a[mindex]>a[j]){
mindex=j;//标记下标
}
}
temp=a[i];//替换下标对应元素
a[i]=a[mindex];
a[mindex]=temp;
}
for(i=0;i<b;i++){
printf("%d ",a[i]);
}
}
其运行结果如下:
插入排序:
双重反向循环直接比较大小并交换
java语言实现
public class sort02 {
public static void main(String[] args) {
int[] a={0,3,5,9,1,7,8,4,2};
System.out.println("排序前:");
show(a);
System.out.println(" ");
int[] b=sort(a);
System.out.println("排序后");
show(b);
}
private static int[] sort(int [] a) {
for (int i = 0; i < a.length-1; i++) {
for (int j = i; j >=0; j--) {//双重反向循环
if(a[j]>a[j+1]){//直接比较大小
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
return a;
}
public static void show(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
运行结果如下:
C语言实现:
int a[10]={1,9,5,4,3,7,6,8,2,0};
int i,j,k;
for(i=0;i<10;i++){
for(j=i;j>=0;j--){//双重反向循环
if(a[j]>a[j+1]){//直接比较大小
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(k=0;k<10;k++){
printf("%d\t",a[k]);
}
以上是本篇小节,不喜勿喷,感谢理解。