快速排序,说白了就是给基准数据找其正确索引位置的过程.
快速排序主要 是要找准中心基点,直到最大最小点比较最小点大于最大点结束,左右分别开始比较,第一轮比较完毕后,左边基本都是比中心基点小的,右边都是比中心基点大的,两边同时进行递归继续同样操作;
写法一:
1 static void fast() {
2 printf(" "); printf("快速排序请输入:"); printf(" "); 3 static void ks(int arr[], int left, int right); 4 int arr[10]; 5 for (int i = 0; i < 10; i++)scanf("%d", &arr[i]); 6 int len = sizeof(arr) / sizeof(arr[0]);//长度 7 //printf("%d", len); 8 ks(arr, 0, len - 1); 9 //打印 10 for (int i = 0; i < len; i++)printf("%d ", arr[i]); printf(" "); 11 } 12 13 //快速 排序 14 static void ks(int arr[], int left, int right) { 15 int i = left; //最左边的下标 16 int j = right; //最右边的下标 17 int temp;//互换元素 18 int pivot = arr[(left + right) / 2];//中间起点 基准点 19 while (i<=j) 20 { 21 //从左往右找到大于基准点的元素 22 while (arr[i]<pivot) 23 { 24 i++; 25 } 26 //从右往左找到小于于基准点的元素 27 while (arr[j] > pivot) 28 { 29 j--; 30 } 31 //i<=j 进行互换 32 if (i<=j) 33 { 34 temp = arr[i]; 35 arr[i] = arr[j]; 36 arr[j] = temp; 37 i++; 38 j--; 39 } 40 } 41 //递归操作 42 if (left<j) 43 { 44 ks(arr, left, j); 45 } 46 if (i < right) 47 { 48 ks(arr,i, right); 49 } 50 51 }
写法二: c语言
1 #include<stdio.h> 2 int a[6]; 3 int main() { 4 printf("开始快速排序请输出 5个数: "); 5 //快速排序 6 for (int i = 0; i < 5; i++) { 7 scanf_s("%d", &a[i]); 8 } 9 qsort(0, 4);//4=n-1 n是数组长度 10 //降序排列 11 /* for (int i = 5; i>0; i--) { 12 printf("%5d", a[i-1]); 13 }*/ 14 //升序排列 15 for (int i = 0; i<5; i++) { 16 printf("%5d", a[i]); 17 } 18 19 } 20 21 //快速排序 22 qsort(int l, int r)//应用二分思想 23 { 24 int mid = a[(l + r) / 2];//中间数 25 int i = l, j = r; 26 do { 27 while (a[i] < mid) 28 i++;//查找左半部分比中间数大的数 29 while (a[j] > mid) 30 j--;//查找右半部分比中间数小的数 31 if (i <= j)//如果有一组不满足排序条件(左小右大)的数 32 { 33 swap(i, j);//交换 34 i++; 35 j--; 36 } 37 } while (i <= j); 38 if (l < j) 39 qsort(l, j);//递归搜索左半部分 40 if (i < r) 41 qsort(i, r);//递归搜索右半部分 42 } 43 swap(int i, int j) 44 { 45 int temp = a[i]; 46 a[i] = a[j]; 47 a[j] = temp; 48 }