几种常见的排序算法
插入排序
算法思想:从1开始,往后比较,比它小的就替换
实现如下:
// // main.c // insert // // Created by 南瓜不说话 on 2017/9/21. // Copyright © 2017年 南瓜不说话. All rights reserved. // #include <stdio.h> #include <time.h> #include <stdlib.h> void sort(int *p){ int j; int tmp; for(int i = 1;i < 100;i++){ j = i-1; tmp = p[i]; while(p[j] > tmp && j>=0){ p[j+1] = p[j]; j--; } p[j+1] = tmp; } } int main(int argc, const char * argv[]) { srand((int)time(0)); int ar[100]; for (int i = 0;i < 100;i++){ ar[i] = (int)(rand()%100); } int *p = ar; sort(p); for(int i = 0;i < 100;i++){ printf(" %d",p[i]); } printf("\n"); return 0; }
快速排序
算法思想:取一个值,比它小的交换到它左边,比它大的交换到它右边
代码实现如下:
3 // 5 // main.c 7 // quit 9 // 11 // Created by 南瓜不说话 on 2017/9/21. 13 // Copyright © 2017年 南瓜不说话. All rights reserved. 15 // 19 #include <stdio.h> 20 21 #include <stdlib.h> 23 #include<time.h> 31 void sort(int min,int max,int *arr){ 33 int j=max; 35 int i=min; 37 int flag=arr[min]; 39 if(min>=max){ 41 return ; 43 } 45 while (i<j) { 47 while (i<j && arr[j]>=flag) { 49 j--; 51 } 53 arr[i]=arr[j]; 55 while (i<j && arr[i]<=flag) { 57 i++; 59 } 61 arr[j]=arr[i]; 63 } 65 arr[i]=flag; 67 printf(" %d\n",min); 69 sort(min,i-1,arr); 71 sort(i+1,max,arr); 75 } 79 int main(){ 81 srand((int)time(0)); 83 int ar[100]; 85 for (int i=0;i<100;i++){ 87 ar[i]=(int)(rand()%100); 89 } 91 int length=sizeof(ar)/sizeof(ar[0]); 93 int *p=ar; 95 sort(0,length,p); 97 for(int i=0;i<100;i++){ 99 printf(" %d",p[i]); 101 } 103 printf("\n"); 105 return 0; 107 } 108
归并排序:
归并排序思路第一遍看的时候没看懂,不明白怎么合并的,然后网上看了下别人写的代码,豁然开朗。
算法思想:
1.递归拆分数组
递归将数组平分成二等分,一直拆分到单个元素
2.递归合并数组
将数据递归合并,合并之前的数组是一个有序数组
// // main.c // merge // // Created by 南瓜不说话 on 2017/9/22. // Copyright © 2017年 南瓜不说话. All rights reserved. // #include <stdio.h> #include <time.h> #include <stdlib.h> void merge(int *p,int *t,int min,int middle,int max){ int i =min; int j=middle+1; int k=min; while (i<middle+1&&j<max+1) { if(p[i]>p[j]) t[k++] = p[j++]; else t[k++]=p[i++]; } while (i<middle+1) { t[k++]=p[i++]; } while (j<max+1) { t[k++]=p[j++]; } for (i=min; i<k; i++) { p[i]=t[i]; } } void mergeSort(int *p,int *t,int min,int max){ if(min<max){ int middle=(max+min)/2; mergeSort(p, t,min, middle); mergeSort(p,t, middle+1, max); merge(p,t,min,middle,max); } } int main(int argc, const char * argv[]) { srand((int)time(0)); int arr[100]; for (int i = 0;i < 100;i++){ arr[i] = (int)(rand()%100); } int tmp[100]; int *t = tmp; int *p = arr; mergeSort(p,t,0,99); for(int i=0;i<100;i++){ printf(" %d",p[i]); } }