编程语言
首页 > 编程语言> > C语言- 基础数据结构和算法 - 18 快速排序20220618

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