亲们 期末考试啊 暂停更新 2.8左右恢复
新博客开张,就拿排序算法开张吧。。。我尽量从最简单的排序算法开始,不定期连载更新中~
ps:在我学会JAVA和C++之前,程序都用C来写吧,水平有限,大家凑和着看吧 重点是算法!~
(图片来源于网络)
目录:
1.插入排序——直接插入排序。
2.插入排序——希尔排序。
3.选择排序——简单选择排序。
4.选择排序——堆排序。
5.交换排序——冒泡排序。
6.交换排序——快速排序(大力推荐使用)。
7.归并排序。
8.基数排序。
1.插入排序——直接插入排序。
具体算法描述如下:(个人认为很好理解)
ps:可以采用二分查找法来减少比较操作的数目,称为二分查找插入排序法。
C语言代码如下:
1 #include<stdio.h> 2 #define MAXN 10000 3 int main() 4 { 5 printf("请输入一组数,每个数之间以“,”隔开,Enter键结束输入\n"); 6 int arr[MAXN]; //定义一个足够大的数组 7 int i=0,j,k,count = 0; 8 while(count<MAXN) //读入数组,存入数组a中; 9 { 10 scanf("%d",&arr[i++]); 11 count++; 12 if(getchar() == '\n') break; 13 } 14 int target; 15 for (i=1; i<count; i++) //开始排序 16 { 17 j=i; 18 target = arr[i]; //从第二个数开始,依次作为参考点 19 while (j>0 && target<arr[j-1]) 20 { 21 arr[j] = arr[j-1]; 22 j--; 23 } 24 arr[j] = target; 25 } 26 for(i=0;i<count;i++) 27 printf("%d ",arr[i]); 28 return 0; 29 }
ps:修改:输入时以一个空格隔开
2.插入排序——希尔排序(相对于直接插入排序,效率进一步提高)。
具体算法描述如下:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量为1)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
C语言代码如下:
1 #include<stdio.h> 2 #define MAXN 10000 3 4 void shellsort(int a[], int n) 5 { 6 int i, j, gap; 7 for (gap = n / 2; gap > 0; gap /= 2) 8 { 9 for (i = 0; i < gap; i++) //直接插入排序 10 { 11 for (j = i + gap; j < n; j += gap) 12 if (a[j] < a[j - gap]) 13 { 14 int temp = a[j]; 15 int k = j - gap; 16 while (k >= 0 && a[k] > temp) 17 { 18 a[k + gap] = a[k]; 19 k -= gap; 20 } 21 a[k + gap] = temp; 22 } 23 } 24 } 25 } 26 27 int main() 28 { 29 printf("请输入一组数,每个数之间以1个空格隔开,Enter键结束输入\n"); 30 int arr[MAXN]; //定义一个足够大的数组 31 int i=0,j,k,count = 0; 32 while(count<MAXN) //读入数组,存入数组a中; 33 { 34 scanf("%d",&arr[i++]); 35 count++; 36 if(getchar() == '\n') break; 37 } 38 shellsort(arr,count); 39 for(i=0;i<count;i++) 40 printf("%d ",arr[i]); 41 return 0; 42 }
3.选择排序——简单选择排序。
又到了一种简单易理解的算法 0.0
原理如下(摘自百度百科):
设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。
C语言代码如下:
1 #include<stdio.h> 2 #define MAXN 10000 3 int main() 4 { 5 printf("请输入一组数,每个数之间以“,”隔开,Enter键结束输入\n"); 6 int arr[MAXN]; //定义一个足够大的数组 7 int i=0,j,k,count = 0; 8 while(count<MAXN) //读入数组,存入数组a中; 9 { 10 scanf("%d",&arr[i++]); 11 count++; 12 if(getchar() == '\n') break; 13 } 14 15 for(i=0;i<count;i++) 16 { 17 k=i; 18 for(j=i+1;j<count;j++) 19 { 20 if(a[k]>a[j]) 21 k=j; 22 } 23 if (k!=i) 24 { 25 t=a[i]; //互换 26 a[i]=a[k]; 27 a[k]=t; 28 } 29 30 } 31 for(i=0;i<count;i++) 32 printf("%d ",arr[i]); 33 return 0; 34 }
JAVA语言代码如下:
1 class SelectionSort 2 { 3 public static void main(String[] args) 4 { 5 int[] arr = new int[]{1,9,5,7,65,1,5,6,1,5,3,2,7}; 6 selectionSort(arr); 7 printArr(arr); 8 } 9 10 public static void selectionSort(int arr[]) 11 { 12 int tempMax = 0; 13 for(int i = 0;i<arr.length;i++) 14 { 15 for(int j = i+1;j<arr.length;j++) 16 { 17 if(arr[i]>arr[j]) 18 { 19 tempMax = arr[i]; 20 arr[i] = arr[j]; 21 arr[j] = tempMax; 22 } 23 } 24 } 25 } 26 27 public static void printArr(int arr[]) 28 { 29 for(int i = 0;i<arr.length;i++) 30 System.out.print(arr[i]+" "); 31 } 32 }
4.选择排序——堆排序。
待补充...
5.交换排序——冒泡排序。
C语言代码如下:
1 #include<stdio.h> 2 #define MAXN 10000 3 4 void bubble_sort(int a[],int n) 5 { 6 int i,j,temp; 7 for(j=0;j<n-1;j++) 8 { 9 for(i=0;i<n-1-j;i++) 10 { 11 if(a[i]>a[i+1]) //数组元素大小按升序排列 12 { 13 temp=a[i]; //交换 14 a[i]=a[i+1]; 15 a[i+1]=temp; 16 } 17 } 18 } 19 } 20 int main() 21 { 22 printf("请输入一组数,每个数之间以1个空格隔开,Enter键结束输入\n"); 23 int arr[MAXN]; //定义一个足够大的数组 24 int i=0,j,k,count = 0; 25 while(count<MAXN) //读入数组,存入数组a中; 26 { 27 scanf("%d",&arr[i++]); 28 count++; 29 if(getchar() == '\n') break; 30 } 31 bubble_sort(arr,count); 32 for(i=0;i<count;i++) 33 printf("%d ",arr[i]); 34 return 0; 35 }
6.交换排序——快速排序(大力推荐使用)。
终于写到了我最喜欢的快速排序算法。
原理介绍如下:(摘自百度百科)
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟快速排序的算法是:
1 #include<stdio.h> 2 #define MAXN 10000 3 4 void QuickSort(int a[],int numsize) 5 { 6 int i=0,j=numsize-1; 7 int key=a[0]; 8 if(numsize>1) //确保数组长度至少为2,否则无需排序 9 { 10 while(i<j) //循环结束条件 11 { 12 for(;j>i;j--) 13 if(a[j]<key) 14 { 15 a[i++]=a[j]; 16 break; 17 } 18 for(;i<j;i++) 19 if(a[i]>key) 20 { 21 a[j--]=a[i]; 22 break; 23 } 24 } 25 a[i]=key; 26 QuickSort(a,i); //递归 27 QuickSort(a+i+1,numsize-i-1); //递归 28 } 29 } 30 31 int main() 32 { 33 printf("请输入一组数,每个数之间以1个空格隔开,Enter键结束输入\n"); 34 int arr[MAXN]; //定义一个足够大的数组 35 int i=0,j,k,count = 0; 36 while(count<MAXN) //读入数组,存入数组a中; 37 { 38 scanf("%d",&arr[i++]); 39 count++; 40 if(getchar() == '\n') break; 41 } 42 QuickSort(arr,count); 43 for(i=0;i<count;i++) 44 printf("%d ",arr[i]); 45 return 0; 46 }
7.归并排序。
待补充...
8.基数排序。
待补充...