C语言- 基础数据结构和算法 - 18 快速排序20220618
作者:互联网
C语言- 基础数据结构和算法 - 18 快速排序20220618.
听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
18 快速排序20220618.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <time.h> 5 #include <sys/timeb.h> 6 7 /* 8 快速排序:目前排序速度最快效率最高的排序算法。 9 分治法 + 挖坑填数 10 分治法:大问题分解成各个小问题,对小问题求解,从而解决大问题。 分开处理。 11 基准数,一般选择第一个数 arr[0]。 12 */ 13 14 #define MAX 100000 15 16 17 long getSystemTime(){ // 取得当前系统时间 18 struct timeb tb; 19 ftime(&tb); 20 return tb.time*1000 + tb.millitm; 21 } 22 23 // 插入排序 24 void InsertSort(int arr[],int lenght){ 25 26 int i,j; 27 for(i=1;i<lenght;i++){ 28 29 if(arr[i] < arr[i-1]){ 30 int temp = arr[i]; 31 for(j=i-1;j>=0&& temp < arr[j];j--){ 32 arr[j+1] = arr[j]; 33 } 34 arr[j+1]= temp; 35 } 36 } 37 } 38 // 打印函数 39 void PrintArray(int arr[],int lenght){ 40 41 int i; 42 for(i=0;i<lenght;i++){ 43 printf("%-3d ",arr[i]); 44 } 45 printf("\n-------------------------------------------------\n"); 46 } 47 48 // 希尔排序(从小到大) 49 void ShellSort(int arr[],int lenght){ 50 51 // 分组的增量(分多少个组),先默认为lenght; 52 int increaerment = lenght; 53 54 int i,j,k; 55 do{ 56 // 确定分组的增量 57 increaerment = increaerment / 3 + 1 ; 58 59 for(i=0;i<increaerment;i++){ 60 61 for(j=i+increaerment;j<lenght;j+=increaerment){ 62 63 if(arr[j] < arr[j-increaerment]) { 64 65 int temp = arr[j]; 66 for(k=j-increaerment;k>=0 && temp < arr[k];k-=increaerment){ 67 arr[k+increaerment] = arr[k]; 68 } 69 arr[k+increaerment] = temp; 70 } 71 } 72 } 73 74 } while(increaerment > 1); // 先执行上面的do,然后再判断,符合条件再继续执行。 75 } 76 77 // 快速排序(从小到大) 78 void QuickSort(int arr[],int start,int end){ 79 80 int i = start; 81 int j = end; 82 83 // 基准数。所有的数都与基准数进行比较。 84 int temp = arr[start]; 85 86 if(i<j){ 87 while(i<j){ 88 89 // 从右向左去找比基准数小的元素。 90 while(i<j && arr[j]>=temp){ 91 j--; 92 } 93 94 // 填坑 95 if(i<j){ 96 arr[i] = arr[j]; 97 i++; 98 } 99 100 // 从左向右,找双基准数大的数 101 while( i<j && arr[i]< temp){ 102 i++; 103 } 104 105 // 填坑 106 if(i<j){ 107 arr[j] = arr[i]; 108 j--; 109 } 110 } 111 112 // 把基准数放到i或j(i已经等于j了)的位置 113 arr[i] = temp; 114 115 // 递归 对基准数左半部分进行快速排序 116 QuickSort(arr,start,i-1); 117 // 递归,对右半部分进行快速排序 118 QuickSort(arr,i+1,end); 119 120 } 121 } 122 int main(){ 123 printf("好好学习,天天向上~!!\t\t\t 18 快速排序20220618\n\n"); 124 125 int arr[MAX],arr2[MAX],myArr[MAX]; 126 127 srand((unsigned int)time(NULL)); // 随机 128 129 int i; 130 for(i=0;i<MAX;i++){ 131 int randNum= rand() % MAX; 132 arr[i] = randNum; 133 //arr2[i] = randNum; 134 //myArr[i] = randNum; 135 } 136 137 //printf("希尔排序前: "); 138 //PrintArray(arr,MAX); 139 140 //printf("希尔排序后: "); 141 long tshell_start = getSystemTime(); 142 ShellSort(arr,MAX); 143 long tshell_end=getSystemTime(); 144 //PrintArray(arr,MAX); 145 printf("希尔排序%d个元素所需时间(毫秒):%ld \n",MAX,tshell_end-tshell_start); 146 147 //long tinsert_start = getSystemTime(); 148 //InsertSort(arr2,MAX); 149 //long tinsert_end=getSystemTime(); 150 //PrintArray(arr2,MAX); 151 //printf("插入排序%d个元素所需时间(毫秒):%ld \n",MAX,tinsert_end-tinsert_start); 152 153 int len = sizeof(myArr) / sizeof(int); 154 155 //printf("快速排序前: "); 156 //PrintArray(myArr,len); 157 158 //printf("快速排序后: "); 159 //long tQuick_start = getSystemTime(); 160 //QuickSort(myArr,0,len-1); 161 //long tQuick_end=getSystemTime(); 162 //printf("快速排序%d个元素所需时间(毫秒):%ld \n",MAX,tQuick_end-tQuick_start); 163 //PrintArray(myArr,len); 164 165 printf("\n\n"); 166 system("pause"); 167 return 0; 168 }
标签:arr,include,temp,20220618,int,18,C语言,排序,tb 来源: https://www.cnblogs.com/stou/p/16389048.html