★改进的快速排序算法(C++代码)★

合集下载

快速排序与归并排序算法及时间复杂度分析(C++)

快速排序与归并排序算法及时间复杂度分析(C++)
cin>>input[i]; } //处理数据 clock_t start,finish; double totaltime; start=clock(); ////开始统计时间 mergeSort(input,0,n-1); //输出结果 for(i=0; i<n; ++i)
cout<<input[i]<<" "; cout<<endl; system("pause"); /// finish=clock(); totaltime=(double)(finish-start)/CLOCKS_PER_SEC; //统计时间截止 cout<<"\n 此程序的运行时间为"<<totaltime<<"秒!"<<endl; return 0; } 操作结果截屏
cin>>a[i]; } clock_t start,finish; //typedef long clock_t; double totaltime; start=clock(); ////开始统计时间 Qsort(a,0,n-1);/*这里原文第三个参数要减 1 否则内存泄露*/ for(i=0;i<n;i++) { cout<<a[i]<<" "; } system("pause"); /// finish=clock();
mergeSort(a,0,n-1);
for(i=0; i<n; ++i){
cout<<a[i]<<" ";

c#实现最简洁的快速排序(你绝对可以看懂)

c#实现最简洁的快速排序(你绝对可以看懂)

c#实现最简洁的快速排序(你绝对可以看懂)前⾔算法对于程序员的重要性不⾔⽽喻,今天我和⼤家分享算法中的⼀个基础算法,快速排序。

作为⼀名程序员,相信⼤家都不陌⽣,但是要⼤家徒⼿⼀次性写出来,我估计还是有难度的。

那么废话不多少,我先简单减少⼀下概念。

快速排序算法说明:原始数组L1,从中任意选择⼀个基准数F(⼀般选择第1个),⼩于F的数据放在F的左边记为数组minList,⼤于F的数据放在F的右边记为数组maxList。

那么L1=minList+F+maxList然后对minList和maxList再做这样的操作,直到minList和maxList中的元素个数为1或者0的时候停⽌⼀、C#⽹上⽬前最简洁的实现⽅式:现在就是要进⾏算法的实现了,很明显,这⾥要⽤到⼀个叫递归的思想。

我们知道编程语⾔知识⼯具,算法才是核⼼,但是不同的编程语⾔实现算法却有很⼤的不同(简洁程度)。

⽬前⽹上对于c#的实现快速排序的⽅式有很多,简单查阅了⼀下,发现⼀般都要100⾏代码左右(c和c++的代码⾏数要少⼀些)。

千找万找,终于找到了⼀个,贴出如下:static void QuickSort(ref List<int> nums, int left, int right){if (left < right){int i = left;int j = right;int middle = nums[(left + right) / 2];while (true){while (i < right && nums[i] < middle) { i++; };while (j > 0 && nums[j] > middle) { j--; };if (i == j) break;int temp = nums[i];nums[i] = nums[j];nums[j] = temp;if (nums[i] == nums[j]) j--;}QuickSort(ref nums, left, i);QuickSort(ref nums, i + 1, right);}}但是说真的,很难读懂,真要在考场上写出这个代码,难保能⼀次写对。

快排算法代码

快排算法代码

快排算法代码快速排序算法是一种用于排序元素的高效算法。

它的核心思想是选择一个基准元素,将其放入一个合适的位置,然后将序列分成两个部分,其中左半部分的所有元素都小于基准元素,右半部分的所有元素都大于基准元素。

在分得两个部分后,分别对左半部分和右半部分递归地应用快速排序算法,最终将序列排好序。

快速排序算法的优点在于其执行时间短,对内存的消耗较小,同时在处理大数据量时显示出其稳定的性能表现。

快速排序算法的实现需要通过编写代码来实现,以下是一个典型的快速排序算法的代码示例:``` void quicksort(int arr[], int left, intright) { int i = left, j = right, tmp; intpivot = arr[(left + right) / 2]; /* partition*/ while (i <= j) { while (arr[i] <pivot) i++; while (arr[j] >pivot) j--; if (i <= j){ tmp = arr[i]; arr[i] =arr[j]; arr[j] = tmp; i++; j--; } }; /* recursion */if (left < j) quicksort(arr, left, j); if (i < right) quicksort(arr, i, right); } ```上述代码是一个递归实现的快速排序算法,可以将一个整型数组按升序排列。

这段代码接受三个参数,分别是整型数组 `arr`、左端点 `left` 和右端点 `right`。

该代码的处理流程如下:1. 获取一个基准元素 `pivot`,从当前序列的中间位置开始选择。

2. 将该序列分成两个部分,其中左半部分的所有元素都小于等于基准元素,右半部分的所有元素都大于等于基准元素。

各种排序算法代码(C语言版)

各种排序算法代码(C语言版)

各种排序算法代码(C语⾔版)选择排序#include <stdio.h>/** 选择排序* 稳定性:不稳定* 时间复杂度:O(N^2)**/void select_sort(int a[], int l, int r){for (int m_v, m_idx, t, i = l; i < r; ++i) {m_v = a[i]; m_idx = i;for (int j = i + 1; j < r; ++j) {if (m_v > a[j]) {m_v = a[j];m_idx = j;}}t = a[i]; a[i] = a[m_idx]; a[m_idx] = t;}}int main(void){int a[100];int n; scanf("%d", &n);for (int i = 0; i < n; ++i) scanf("%d", &a[i]);select_sort(a, 0, n);for (int i = 0; i < n; ++i) printf("%d ", a[i]);return0;}冒泡排序#include <stdio.h>/** 冒泡排序* 稳定性:稳定void bubble_sort(int a[], int l, int r){for (int i = l; i < r; ++i) {for (int j = l; j < r - i - 1; ++j) {if (a[j] > a[j + 1]) {int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;}}}}int main(void){int a[100];int n; scanf("%d", &n);for (int i = 0; i < n; ++i) scanf("%d", &a[i]); bubble_sort(a, 0, n);for (int i = 0; i < n; ++i) printf("%d ", a[i]);return0;}插⼊排序#include <stdio.h>/** 插⼊排序* 稳定性:稳定* 时间复杂度: O(N^2)**/void insert_sort(int a[], int l, int r){for (int tmp, j, i = l + 1; i < r; ++i) {tmp = a[i], j = i - 1;while (j >= l && tmp < a[j]) a[j+1] = a[j--]; a[j+1] = tmp;}}int main(void){for (int i = 0; i < n; ++i) scanf("%d", &a[i]); insert_sort(a, 0, n);for (int i = 0; i < n; ++i) printf("%d ", a[i]);return0;}希尔排序#include <stdio.h>/** 希尔排序* 稳定性:不稳定* 时间复杂度:O(N*logN)**/void shell_insert_sort(int a[], int l, int r, int d) {for (int tmp, j, i = l + d; i < r; ++i) {tmp = a[i], j = i - d;while (j >= l && tmp < a[j]) {a[j + d] = a[j];j -= d;}a[j + d] = tmp;}}void shell_sort(int a[], int l, int r){int d = (r - l) / 2;while (d >= 1) {shell_insert_sort(a, l, r, d);d /= 2;}}int main(void){int a[100];int n; scanf("%d", &n);for (int i = 0; i < n; ++i) scanf("%d", &a[i]); shell_sort(a, 0, n);for (int i = 0; i < n; ++i) printf("%d ", a[i]);归并排序/** 归并排序* 稳定性:稳定* 时间复杂度:O(N*logN)**/void merge(int a[], int n, int b[], int m, int t[]) {int i, j, k;i = j = k = 0;while (i < n && j < m) {if (a[i] < b[j]) t[k++] = a[i++];else t[k++] = b[j++];}while (i < n) t[k++] = a[i++];while (j < m) t[k++] = b[j++];}void my_merge_sort(int a[], int l, int r, int t[]) {int mid = (l + r) >> 1;int n = r - l;int i;if (l + 1 < r) {my_merge_sort(a, l, mid, t);my_merge_sort(a, mid, r, t);merge(a+l, mid-l, a+mid, r-mid, t);for (i = 0; i < n; ++i) a[i + l] = t[i];}}void merge_sort(int a[], int l, int r){int *t = (int *)malloc((r-l) * sizeof (int));my_merge_sort(a, l, r, t);free(t);}堆排序* 堆排序* 稳定性:不稳定* 时间复杂度:O(N*logN)**/// big top pilevoid heap_adjust(int a[], int fa, int n){int cd = fa * 2 + 1;while (cd < n) {if (cd + 1 < n && a[cd] < a[cd + 1]) cd++;if (a[fa] >= a[cd]) break;int tmp = a[fa];a[fa] = a[cd];fa = cd;cd = fa * 2 + 1;a[fa] = tmp;}}void build_heap(int a[], int n){// ignore leap nodefor (int i = (n - 1) / 2; i >= 0; --i) {heap_adjust(a, i, n);}}void heap_sort(int a[], int l, int r){build_heap(a + l, r - l);for (int tmp, i = r - 1; i > l; --i) {tmp = a[i]; a[i] = a[0]; a[0] = tmp;heap_adjust(a + l, 0, i);}}int main(void){int a[100];int n; scanf("%d", &n);for (int i = 0; i < n; ++i) scanf("%d", &a[i]); heap_sort(a, 0, n);return0;}快速排序/** 快速排序* 稳定性:不稳定* 时间复杂度:O(N*logN)**/void quick_sort(int a[], int l, int r){if (l + 1 >= r) return ;int low = l, high = r;int key = a[l];while (low < high) {while (low < high && a[--high] >= key); a[low] = a[high];while (low < high && a[++low] < key); a[high] = a[low];}a[low] = key;quick_sort(a, l, low);quick_sort(a, low+1, r);}基数排序/** 基数排序* 稳定性:稳定* 时间复杂度:O(d(n+radix)) [d个关键码,关键码的取值范围为radix] **/int tmp[100000000];void radix_sort(int arr[], int beg, int ed){static int a[9] = {1, 10, 100, 1000, 10000, 100000, 1000000};int cnt[10]; // 0~9⼗个数字int digit = 0; // 最⼤位数for (int i = beg; i < ed; ++i)while (arr[i] / a[digit + 1] > 0) digit++;for (int idx = 0; idx <= digit; ++idx) {for (int i = 0; i < 10; ++i) cnt[i] = 0; // 桶计数清零for (int i = beg; i < ed; ++i) cnt[ arr[i]/a[idx]%10 ]++; // 统计每个数字出现的次数// 前缀和统计每个数字前⾯的数字个数这样就可以知道每个数字应该排在第⼏位了for (int i = 1; i < 10; ++i) cnt[i] += cnt[i - 1];for (int i = ed - 1; i >= beg; --i) tmp[ --cnt[arr[i]/a[idx]%10] ] = arr[i];for (int i = beg, j = 0; i < ed; ++i, ++j) arr[i] = tmp[j];}}测试性能int a[100000000];double test(void(*fun)(int*, int, int), int range){for (int i = 0; i < range; ++i) a[i] = rand();clock_t start = clock();fun(a, 0, range);clock_t finish = clock();//for (int i = 0; i < range; ++i) printf("%d\n", a[i]);return ((double)finish - start) / CLOCKS_PER_SEC;}int main(){srand((unsigned)time(NULL));printf(" 数据范围堆排序归并排序希尔排序快速排序插⼊排序冒泡排序选择排序基数排序\n");for (int range = 100; range <= 100000; range *= 10) {printf("%9d %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n", range, test(heap_sort, range), test(merge_sort, range), test(shell_sort, range), test(quick_sort, range), test(insert_sort, range), test(bubble_sort, range), test(select_sort, range), test(radix_sort, range));}for (int range = 1000000; range <= 10000000; range *= 10) {printf("%9d %8.3f %8.3f %8.3f %8.3f %8.3f\n", range, test(heap_sort, range), test(merge_sort, range), test(shell_sort, range),test(quick_sort, range), test(radix_sort, range));}return0;。

快速排序算法c语言代码

快速排序算法c语言代码

快速排序算法c语言代码快速排序是一种常见的排序算法,也叫作分治快排。

快速排序的核心思想是通过一个基准数,把待排序的数列分成两个部分,一部分比基准数小,一部分比基准数大,然后继续对这两个部分分别进行快速排序,直到整个数列有序为止。

快速排序的实现过程如下:1.选择基准数在排序过程中,需要选择一个基准数,用来将待排序的数列分成两个部分。

一般选择数列的第一个数作为基准数,但也可以随机选择一个数作为基准数。

2.分割数列根据基准数将待排序的数列分成两个部分,一部分是比基准数小的数,另一部分是比基准数大的数。

可以用两个指针,一个指向数列的头部,一个指向数列的尾部,从两端开始遍历,交换不满足条件的数。

3.递归排序对分割出来的两个数列分别进行快速排序,重复以上步骤,直到整个数列有序为止。

代码实现:void quick_sort(int s[],int l,int r) {if(l<r){int i=l,j=r,x=s[l];while(i<j){while(i<j&&s[j]>=x)j--;if(i<j)s[i++]=s[j];while(i<j&&s[i]<x)i++;if(i<j)s[j--]=s[i];}s[i]=x;quick_sort(s,l,i-1);quick_sort(s,i+1,r);}}快速排序算法是一种时间复杂度为O(nlogn)的比较排序算法,其效率比冒泡排序和选择排序要高。

在实际应用中,快速排序广泛应用于数据库排序和大数据量的排序等场景。

C语言实现快速排序

C语言实现快速排序

C语⾔实现快速排序我觉得冒泡排序是⽐较简单的;所以今天我们实现⼀个叫做快速排序的;Problem你想要将(4,3,5,1,2)排序成(1,2,3,4,5)你决定使⽤最简单的快速排序;Solution⾸先,打开你的terminal,我写得C代码通常都是⽤vi编辑,gcc编译;vim quickSortSample.c因为,快速排序需要对数据进⾏分割然后处理,再分割再处理;显然需要⼀个递归的过程;所以,我们先把递归结束条件写好;#include <stdio.h>void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;}也就是说,当输⼊只有⼀个数字就没有必要排序啦!直接返回;void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {//TODO ...}}注意: p = a[n / 2];的⽬地是获取数组中得中间位置的数据;我们都知道,数组下标是整数,因此,如果n=3那么n/2应该是1,此时正好平分数组;若是,n=4那么n/2应该是2,⽽此时它们就不完全是平分数组啦;for循环的作⽤是为了从前后两个⽅向分别遍历;void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;}}注意:我们在for循环中⼜进⾏啦while循环;它的作⽤是对元素进⾏遍历,假设左边的数据没有p中保存的元素⼤,那么继续寻找,并且把i⾃增;当找到⽐p⼤的或者相等得则停⽌第⼀个while循环;例如:如果数组(2,5,3,1,4)那么p显然是3,当while循环发现5⼤于3时停⽌循环,此时i=1;同理,第⼆个while循环中,p依然是3,当while循环第⼀次发现4⼤于3则继续循环此时j=4;当while循环到j=3时,得到的元素是1,1不⼤于3所以停⽌循环,此时得到的j=3;好啦!那么我们知道在for循环中没有明确指定循环停⽌条件;它该什么时候停⽌呢?void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;if ( i >= j)break;}}注意:当i>=j意味着此时数据已经全部遍历完了;因为i与j分布在数组左右两部分,当它们重合,当然也就表明它们遍历完啦;刚才,我们的两个while循环分别找到啦⼀个左边⽐p⼤得元素,和⼀个右边⽐p⼩的数字;显然这两个元素应该交换位置的;那么怎么实现呢;void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;if ( i >= j)break;tmp = a[i]; a[i] = a[j]; a[j] = tmp; //swap both ..}}我们看到了,在冒泡排序中也⽤到得交换语句;此时我们完全遍历了⼀遍数组;我们在main函数中测试⼀下;#include <stdio.h>void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;if ( i >= j)break;tmp = a[i]; a[i] = a[j]; a[j] = tmp; //swap both ..}}int main(void){int a[] = { 2, 5, 3, 1, 4};int n = sizeof a /sizeof a[0];int i;for (i = 0; i < n; i++)printf("%d%s", a[i], i == n -1 ? "\n" : "");quick_sort(a, n);for (i = 0; i < n; i++)printf("%d%s", a[i], i == n -1 ? "\n" : "");return0;}main函数的语句都⾮常容易懂,就不解释啦;看看编译运⾏的结果:显然,运⾏的结果是我们预期的;3左边的都⽐3⼩啦!那若果数据多⼀些呢;⽐如{ 2, 5, 7, 3, -1, 1, 4}我们会发现左边有两个元素都⽐3⼤,理论上要进⾏两次交换;显然当它交换完[1]与[5]元素后,它⼜是怎么继续的我们关⼼这个问题;显然交换完数据后,⼜进⼊for循环;for循环没有结束条件,因此,i++,j--完成后,此时i=2,j=4;接下来执⾏两个while发现,第⼀个while发现a[2]是7 不⼩于p此时不执⾏i++;同样在第⼆个while中也发现a[4]是-1不⼤于p此时不执⾏j--;然后到if语句不成⽴,因此继续进⾏数据交换;测试如下数据;#include <stdio.h>void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;if ( i >= j)break;tmp = a[i]; a[i] = a[j]; a[j] = tmp; //swap both ..}}int main(void){int a[] = { 2, 5, 7, 3, -1, 1, 4};int n = sizeof a /sizeof a[0];int i;for (i = 0; i < n; i++)printf("%d%s", a[i], i == n -1 ? "\n" : "");quick_sort(a, n);for (i = 0; i < n; i++)printf("%d%s", a[i], i == n -1 ? "\n" : "");return0;}我们会得到如下结果:显然,我们已经得到啦p左边都是⼩于p的;右边则是⼤于p的;符合我们的设想;为了把整个数组正确排序,我们需要分别⼜对两部分重复⼀遍刚才的操作;好,我们递归的调⽤函数,并且把数组的两部分元素传递到函数中;void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;if ( i >= j)break;tmp = a[i]; a[i] = a[j]; a[j] = tmp; //swap both ..}quick_sort( a, i);quick_sort( a + i, n - i);}注意:第⼀个递归调⽤处理数组的前部分,a对应的是数组的⾸地址,i是指对应的元素个数;第⼆个递归调⽤处理数组后部分,a + i指的当然是⾸地址加偏移地址,如果你对偏移地址有问题的话,应该看看计算机寻址⽅式的资料啦;接下来看运⾏结果:最后,我们把所有代码附上:#include <stdio.h>void quick_sort( int *a, int n){int i, j, p, tmp;if (n < 2) return;p = a[n / 2]; // Get the middle element as pivot ..for ( i = 0, j = n -1;; i++, j--) {while (a[i] < p)i++;while (p < a[j])j--;if ( i >= j)break;tmp = a[i]; a[i] = a[j]; a[j] = tmp; //swap both ..}quick_sort( a, i);quick_sort( a + i, n - i);}int main(void){int a[] = { 2, 5, 7, 3, -1, 1, 4};int n = sizeof a /sizeof a[0];int i;for (i = 0; i < n; i++)printf("%d%s", a[i], i == n -1 ? "\n" : ""); quick_sort(a, n);for (i = 0; i < n; i++)printf("%d%s", a[i], i == n -1 ? "\n" : ""); return0;}。

CC++实现快速排序算法的思路及原理解析

CC++实现快速排序算法的思路及原理解析

CC++实现快速排序算法的思路及原理解析⽬录快速排序2. 实现原理3. 动态演⽰4. 完整代码5. 结果展⽰6. 算法分析快速排序1. 算法思想快速排序的基本思想:通过⼀趟排序将待排记录分隔成独⽴的两部分,其中⼀部分记录的关键字均⽐另⼀部分的关键字⼩,则可分别对这两部分记录继续进⾏排序,以达到整个序列有序。

2. 实现原理2.1、设置两个变量 low、high,排序开始时:low=0,high=size-1。

2.2、整个数组找基准正确位置,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基准值⼤的摆在基准的后⾯默认数组的第⼀个数为基准数据,赋值给key,即key=array[low]。

因为默认数组的第⼀个数为基准,所以从后⾯开始向前搜索(high–),找到第⼀个⼩于key的array[high],就将 array[high] 赋给 array[low],即 array[low] = array[high]。

(循环条件是 array[high] >= key;结束时 array[high] < key)此时从前⾯开始向后搜索(low++),找到第⼀个⼤于key的array[low],就将 array[low] 赋给 array[high],即 array[high] = array[low]。

(循环条件是 array[low] <= key;结束时 array[low] > key)循环 2-3 步骤,直到 low=high,该位置就是基准位置。

把基准数据赋给当前位置。

2.3、第⼀趟找到的基准位置,作为下⼀趟的分界点。

2.4、递归调⽤(recursive)分界点前和分界点后的⼦数组排序,重复2.2、2.3、2.4的步骤。

2.5、最终就会得到排序好的数组。

3. 动态演⽰4. 完整代码三个函数基准插⼊函数:int getStandard(int array[],int low,int high)(返回基准位置下标)递归排序函数:void quickSort(int array[],int low,int high)主函数:int main()#include <stdio.h>#include <stdlib.h>void display(int* array, int size) {for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");}int getStandard(int array[], int i, int j) {// 基准数据int key = array[i];while (i < j) {// 因为默认基准是从左边开始,所以从右边开始⽐较// 当队尾的元素⼤于等于基准数据时,就⼀直向前挪动 j 指针while (i < j && array[j] >= key) {j--;}// 当找到⽐ array[i] ⼩的时,就把后⾯的值 array[j] 赋给它if (i < j) {array[i] = array[j];}// 当队⾸元素⼩于等于基准数据时,就⼀直向后挪动 i 指针while (i < j && array[i] <= key) {i++;}// 当找到⽐ array[j] ⼤的时,就把前⾯的值 array[i] 赋给它if (i < j) {array[j] = array[i];}}// 跳出循环时 i 和 j 相等,此时的 i 或 j 就是 key 的正确索引位置// 把基准数据赋给正确位置array[i] = key;return i;}void QuickSort(int array[], int low, int high) {// 开始默认基准为 lowif (low < high) {// 分段位置下标int standard = getStandard(array, low, high);// 递归调⽤排序// 左边排序QuickSort(array, low, standard - 1);// 右边排序QuickSort(array, standard + 1, high);}}// 合并到⼀起快速排序// void QuickSort(int array[], int low, int high) {// if (low < high) {// int i = low;// int j = high;// int key = array[i];// while (i < j) {// while (i < j && array[j] >= key) {// j--;// }// if (i < j) {// array[i] = array[j];// }// while (i < j && array[i] <= key) {// i++;// }// if (i < j) {// array[j] = array[i];// }// }// array[i] = key;// QuickSort(array, low, i - 1);// QuickSort(array, i + 1, high);// }// }int main() {int array[] = {49, 38, 65, 97, 76, 13, 27, 49, 10};int size = sizeof(array) / sizeof(int);// 打印数据printf("%d \n", size);QuickSort(array, 0, size - 1);display(array, size);// int size = 20;// int array[20] = {0}; // 数组初始化// for (int i = 0; i < 10; i++) { // 数组个数// for (int j = 0; j < size; j++) { // 数组⼤⼩// array[j] = rand() % 1000; // 随机⽣成数⼤⼩ 0~999// }// printf("原来的数组:");// display(array, size);// QuickSort(array, 0, size - 1);// printf("排序后数组:");// display(array, size);// printf("\n");// }return 0;}5. 结果展⽰(递归调⽤,不好展⽰每次排序结果)6. 算法分析时间复杂度:最好: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2n)最坏: O ( n 2 ) O(n^2) O(n2)平均: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2n)空间复杂度: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2n)稳定性:不稳定到此这篇关于C/C++实现快速排序算法的思路及原理解析的⽂章就介绍到这了,更多相关C++实现快速排序算法内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

C语言快速排序算法

C语言快速排序算法

C语言快速排序算法(一)概述快速排序(Quick Sort)是一种有效的排序算法。

虽然算法在最坏的情况下运行时间为O(n^2),但由于平均运行时间为O(nlogn),并且在内存使用、程序实现复杂性上表现优秀,尤其是对快速排序算法进行随机化的可能,使得快速排序在一般情况下是最实用的排序方法之一。

快速排序被认为是当前最优秀的内部排序方法。

(二)实现快速排序的实现基于分治法,具体分为三个步骤。

假设待排序的序列为L[m..n]。

分解:序列L[m .. n]被划分成两个可能为空的子序列L[m .. pivot-1]和L[pivot+1 .. n],使L[m .. pivot-1]的每个元素均小于或等于L[pivot],同时L[pivot+1.. n]的每个元素均大于L[pivot]。

其中L[pivot]称为这一趟分割中的主元(也称为枢轴、支点)。

解决:通过递归调用快速排序,对子序列L[m .. pivot-1]和L[pivot+1 .. r]排序。

合并:由于两个子序列是就地排序的,所以对它们的合并不需要操作,整个序列L[m .. n]已排好序。

(三)性质内部排序快速排序是一种内部排序方法。

也就是说快速排序的排序对象是读入内存的数据。

比较排序快速排序确定元素位置的方法基于元素之间关键字大小的比较。

所有基于比较方法的排序方法的时间下界不会低于O(nlgn)。

这个结论的具体证明,请参考有关算法的书籍,例如《算法导论》(第一版)第8章(第二版在第七章QuickSort)。

在理想情况下,能严格地达到O(nlgn)的下界。

一般情况下,快速排序与随机化快速排序的平均情况性能都达到了O(nlgn)。

不稳定性快速排序是一种不稳定的排序方法。

简单地说,元素a1, a2的关键字有a1.key=a2.key,则不稳定的排序方法不能保证a1, a2在排序后维持原来的位置先后关系。

原地排序在排序的具体操作过程中,除去程序运行实现的空间消费(例如递归栈),快速排序算法只需消耗确定数量的空间(即S(1),常数级空间)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// start from here int main() {
EnableMemCheck();
int arr[20]; int arr2[20]; cout << "Enter 20 numbers: "; for(int i=0; i<20; i++) {
cin >> arr[i]; arr2[i] = arr[i]; }
temp = arr[j]; arr[j] = arr[low]; arr[low] = temp;
improved_qsort(arr, low, j-1); improved_qsort(arr, i, high); }
// // the origin quick sort method //
// divide the origin number series into two part int partition(int arr[], int low, int high) {
LARGE_INTEGER liFrequency; LARGE_INTEGER liStart; LARGE_INTEGER liEnd;
QueryPerformanceFrequency(&liFrequency); // get clock frequency
QueryPerformanceCounter(&liStart); // time start improved_qsort(arr, 0, 19); QueryPerformanceCounter(&liEnd); // time end cout << "after improved_qsort(" << (liEnd.QuadPart-liStart.QuadPart)*1000000/liFrequency.QuadPart
改进的快速排序算法(C++代码)
/* * 快速排序以及改进的快速排序算法 * 2010/8/29 * 参考自《程序员面试宝典》 */
#include <iostream> #include <crtdbg.h> #include <cstdlib> #include <windows.h> // for time test using namespace std;
int i = low; int j = high; int pivot = arr[i]; while(i < j) {
while(i<j && arr[j]>=pivot) j--; if(i<j) arr[i++] = arr[j];
while(i<j && arr[i]<=pivot) i++; if(i<j) arr[j--] = arr[i]; } arr[i] = pivot; return i; }
<< "μs): "; for(int i=0; i<20; i++) cout << arr2[i] << " "; cout << endl;
system("PAUSE"); return 0;
} 程序输出:
void quick_sort(int arr[], int low, int high) {
if(low >= high) return;
int pivot_pos = partition(arr, low, high);
quick_sort(arr, low, pivot_pos-1); quick_sort(arr _DEBUG #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif // _DEBUG
// memory leak check inline void EnableMemCheck() {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); }
// // improved quick sort method // void improved_qsort(int arr[], int low, int high) {
if(low >= high) return;
int i = low; int j = high+1; int pivot = arr[i]; int temp;
while(i<j) {
for(i=i+1; i<high; i++) if(arr[i] >= pivot) break;
for(j=j-1; j>low; j--) if(arr[j] <= pivot) break;
if(i<j) {
temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
<< "μs): "; for(int i=0; i<20; i++) cout << arr[i] << " "; cout << endl;
QueryPerformanceCounter(&liStart); // time start quick_sort(arr2, 0, 19); QueryPerformanceCounter(&liEnd); // time end cout << "after quick_sort(" << (liEnd.QuadPart-liStart.QuadPart)*1000000/liFrequency.QuadPart
相关文档
最新文档