赞
踩
目录
- #include <stdio.h>
-
- void Insertsort(int a[],int n){
- int i,j,t;
- for(i=1;i<n;i++){
- if(a[i]<a[i-1]){
- t=a[i];
- j=i-1;
- do{
- a[j+1]=a[j];
- j--;
- }while(j>=0 && a[j]>t);
- }
- a[j+1]=t;
- }
- }
-
- int main()
- {
- int a[9];
- int n;
- printf("请输入n个数:\nn=");
- scanf("%d",&n);
- printf("请输入:");
- for(int i=0;i<n;i++)
- scanf("%d",&a[i]);
- Insertsort(a,n);
- printf("排序后的数字顺序为:");
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
-
- void Shellsort(int a[],int n){
- int i,j,d,t;
- d=n/2;
- while(d>0){
- for(i=d;i<n;i++){
- t=a[i];
- j=i-d;
- while(j>=0 && t<a[j]){
- a[j+d]=a[j];
- j=j-d;
- }
- a[j+d]=t;
- }
- d=d/2;
- }
- }
-
- int main()
- {
- int a[9];
- int n;
- printf("请输入n个数:\nn=");
- scanf("%d",&n);
- printf("请输入:");
- for(int i=0;i<n;i++)
- scanf("%d",&a[i]);
- Shellsort(a,n);
- printf("排序后的数字顺序为:");
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
-
- void SelectSort(int a[],int n)
- {
- int t,k;
- for(int i=0;i<n-1;i++)
- {
- k=i;
- for(int j=i;j<n;j++)
- {
- if(a[j]<a[k])
- {
- k=j;//记录最小值的下标
- }
- }
- if(k!=i)
- {
- t=a[k];
- a[k]=a[i];
- a[i]=t;
- }
- }
- }
-
- int main()
- {
- int n=5;
- int a[n];
- printf("请输入%d个数:",n);
- for(int i=0;i<n;i++)
- scanf("%d",&a[i]);
- SelectSort(a,n);
- printf("排序后的顺序为:");
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
-
- void sift(int a[],int low,int high)
- {
- int i=low,j=2*i;
- int t=a[i];
- while(j<=high)
- {
- if(j<high && a[j]<a[j+1])
- j++;
- if(t<a[j])
- {
- a[i]=a[j];
- i=j;
- j=2*i;
- }
- else
- break;
- }
- a[i]=t;
- }
-
-
-
- void HeapSort(int a[],int n)
- {
- int i,t;
- for(i=n/2;i>=1;i--)
- sift(a,i,n);
- for(i=n;i>=2;i--)
- {
- t=a[1];
- a[1]=a[i];
- a[i]=t;
- //swap(a,0,i);
- sift(a,1,i-1);
- }
- }
-
-
- int main(){
- int a[]={6,8,7,9,0,1,3,2,4,5};
- int n = sizeof(a) / sizeof(a[0]);
- printf("%d\n",n);
- HeapSort(a,n);
- printf("排序好的数值顺序为:");
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
-
- void MaopaoSort(int a[],int n)
- {
- int t;
- for(int i=0;i<n-1;i++) //4个数比较3次,n个数执行n-1次
- {
- for(int j=0;j<n-1-i;j++)
- //第n次比较中要比上一次少比较1次
-
- //如序列 3 2 4 1
- //第一次 4_1 2_1 3_1 交换位置,比较3次
- //第二次 4_2 3_4 交换位置,比较2次
- //第三次 3_4 交换位置,比较1次
- {
- if(a[j]>a[j+1])
- {
- t=a[j];
- a[j]=a[j+1];
- a[j+1]=t;
- }
- }
- }
- }
-
- int main()
- {
- int a[]={4,53,2,135,21,13,315,124};
- int n=sizeof(a)/sizeof(a[0]);
- MaopaoSort(a,n);
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
-
- int partition(int a[],int s,int t)
- {
- int i=s,j=t;
- int tmp=a[i];
- while(i<j)//从两端交替向中间扫描,直至i=j为止
- {
- while(j>i && a[j]>=tmp)//从右向左扫描,找到一个小于tmp的值
- j--;
- a[i]=a[j];//找到这样的a[j]放到a[i]处
- while(i<j && a[i]<=tmp)
- i++;
- a[j]=a[i];
- }
- a[i]=tmp;
- return i;
- }
-
- void quickSort(int a[],int s,int t)
- {
- int i;
- if(s<t)//区间至少存在两个元素的情况
- {
- i=partition(a,s,t);
- quickSort(a,s,i-1);//对左区间递归排序
- quickSort(a,i+1,t);//对右区间递归排序
- }
- }
-
- int main()
- {
- int a[]={54,4671,134,124,315};
- int n=sizeof(a)/sizeof(a[0]);
- quickSort(a,0,n-1);//对a[0,n-1]的元素进行快速排序
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
- #include <stdlib.h>
- void Merge(int a[],int low,int mid,int high)//归并R[low..high]
- {
- int *R1;
- int i=low,j=mid+1,k=0;//k是R1的下标,i,j分别是第1、2段的下标
- R1=(int *)malloc((high-low+1)*sizeof(int));
- while(i<=mid && j<=high)//在第1段和第2段均未扫描完时循环
- {
- if(a[i]<=a[j])//将第1段中的元素放入R1中
- {
- R1[k]=a[i];
- i++;
- k++;
- }
- else//将第2段中的元素放入R1中
- {
- R1[k]=a[j];
- j++;k++;
- }
- }
- while(i<=mid)//将第1段余下的部分复制到R1
- {
- R1[k]=a[i];
- i++;k++;
- }
- while(j<=high)//将第2段余下的部分复制到R1
- {
- R1[k]=a[j];
- j++;
- k++;
- }
- for(k=0,i=low;i<=high;k++,i++)将R1复制到R[low..high]中
- a[i]=R1[k];
- free(R1);
- }
-
- void MergePass(int a[],int length,int n)//对整个排序序列进行一趟归并
- {
- int i;
- for(i=0;i+2*length-1<n;i=i+2*length)//归并length长的两相邻子表
- Merge(a,i,i+length-1,i+2*length-1);
- if(i+length-1<n-1)//余下两个子表,后者的长度小于length
- Merge(a,i,i+length-1,n-1);//归并这两个子表
- }
-
- void MergeSort(int a[],int n)//二路归并排序
- {
- int length;
- for(length=1;length<n;length=2*length)//进行log2n(向上取整)趟归并
- MergePass(a,length,n);
- }
-
-
- int main()
- {
- int a[]={14,673,25,1314,525,1,2,3,4,7};
- int n=sizeof(a)/sizeof(a[0]);
- MergeSort(a,n);
- for(int i=0;i<n;i++)
- printf("%d,",a[i]);
- return 0;
- }
- #include <stdio.h>
- #include <string.h>
- #define size 10 // 数组长度
- #define D 5 // 最大位数
-
- //取整数M的第i位数
- int GetDigit(int M, int i)
- {
- while(i > 1)
- {
- M /= 10;
- i--;
- }
- return M % 10;
- }
-
- // 基数排序
- void RadixSort(int *num, int len)
- {
- int i, j, k, l, digit;
- int allot[10][size]; // 分配数组
-
- // 初始化分配数组全为0
- memset(allot, 0, sizeof(allot));
-
- // 遍历
- for (i = 1; i <= D; i++)
- {
- // 将每个数据的第i位数分配到allot数组中
- for (j = 0; j < len; j++)
- {
- // 获取当前数据 num[j] 的 第i位数
- digit = GetDigit(num[j], i);
- k = 0;
- // 查找插入的位置
- while (allot[digit][k])
- {
- k++;
- }
- // 将num[j]添加到分配数组allot的第digit行的末尾
- allot[digit][k] = num[j];
- }
- // 将分配数组的数据收集到原数组中
- l = 0;
- for (j = 0; j < 10; j++)
- {
- k = 0;
- // 获取数组allot的每一行的数据 到 原数组中
- while (allot[j][k])
- {
- num[l++] = allot[j][k++];
- }
- }
- memset(allot, 0, sizeof(allot));
- }
- }
-
- int main()
- {
- int i, num[size] = {52, 200, 4, 1034, 17, 3319, 8324, 33112, 603, 8};
- RadixSort(num, size);
-
- for (i = 0; i < size; i++)
- {
- printf("%d ", num[i]);
- }
- printf("\n");
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。