赞
踩
(注:左指针指向的数据始终比中间值小,右指针指向的数据始终比中间值大。)
时间复杂度:最好情况 O(nlogn),最坏情况 O(),平均情况 O(nlogn)
空间复杂度:最好情况 O(logn),最坏情况 O(n)。
C语言实现:(quicksort.c)
- #include <stdio.h>
-
- /* function prototype */
- void quicksort(int *, int, int); // quick sort (recursion)
- void traverse(int *, int); // show element one by one
-
- /* main function */
- int main(void)
- {
- int arr[] = {4,2,6,9,5,1,3};
- int n = sizeof(arr) / sizeof(int);
- traverse(arr, n);
-
- quicksort(arr, 0, n - 1);
- printf("[ after quick sort ] ");
- traverse(arr, n);
- return 0;
- }
- /* subfunction */
- void quicksort(int *array, int start, int end) // quick sort (recursion)
- {
- if(start >= end) return ;
- int low = start, high = end;
- int middata = array[low]; // the first element as middle data
- while(low < high)
- {
- // right side, data is bigger than middle data.High index move a step to left
- while(low < high && array[high] >= middata) high--;
- // right side, if data is smaller than middle data, data change to low index
- array[low] = array[high];
- // left side, data is smaller than middle data.Low index move a step to right
- while(low < high && array[low] < middata) low++;
- // left side, if data is bigger than middle data, data change to high index
- array[high] = array[low];
- }
- // the middle data in the correct position
- array[low] = middata;
- // from the position of the middle data, split to two sides
- quicksort(array, start, low - 1);
- quicksort(array, low + 1, end);
- }
-
- void traverse(int *array, int length) // show element one by one
- {
- printf("elements(%d): ", length);
- for(int k = 0; k < length; k++)
- {
- printf("%d ", array[k]);
- }
- printf("\n");
- }

编译链接: gcc -o quicksort quicksort.c
执行可执行文件: ./quicksort
时间复杂度:最好情况 O(nlogn),最坏情况 O(nlogn),平均情况 O(nlogn)
空间复杂度:O(n)
C语言实现:(mergesort.c)
- #include <stdio.h>
- #include <math.h>
-
- /* function prototype */
- void mergesort(int *, int, int); // merge sort (recursion)
- void traverse(int *, int); // show element one by one
-
- /* main function */
- int main(void)
- {
- int arr[] = {4,2,6,9,5,1,3};
- int n = sizeof(arr) / sizeof(int);
- traverse(arr, n);
-
- mergesort(arr, 0, n - 1);
- printf("[ after merge sort ] ");
- traverse(arr, n);
- return 0;
- }
- /* subfunction */
- void mergesort(int *array, int start, int end) // merge sort (recursion)
- {
- if(start >= end) return ;
- // from the middle, split the array to the left side and the right side
- int mid = start + ceil((end - start) / 2);
- mergesort(array, start, mid);
- mergesort(array, mid + 1, end);
- // merge the left and right, sort to the new array
- int tmparr[end - start + 1];
- int i = start, j = mid + 1;
- for(int k = 0; k <= end - start; k++)
- {
- // the right side is over or left data < right data, copy the left data
- if(j > end || (i <= mid && array[i] < array[j]))
- {
- tmparr[k] = array[i];
- i++;
- }
- // the left side is over or left data >= right data, copy the right data
- else
- {
- tmparr[k] = array[j];
- j++;
- }
- }
- // elements in the new array copy to the original array
- for(int i = start, k = 0; i <= end; i++, k++)
- {
- array[i] = tmparr[k];
- }
- }
-
- void traverse(int *array, int length) // show element one by one
- {
- printf("elements(%d): ", length);
- for(int k = 0; k < length; k++)
- {
- printf("%d ", array[k]);
- }
- printf("\n");
- }

编译链接: gcc -o mergesort mergesort.c
执行可执行文件: ./mergesort
时间复杂度:O() - O(
)
空间复杂度:O(1)
C语言实现:(shellsort.c)
- #include <stdio.h>
- #include <math.h>
-
- /* function prototype */
- void shellsort(int *, int); // shell sort
- void traverse(int *, int); // show element one by one
-
- /* main function */
- int main(void)
- {
- int arr[] = {4,2,6,9,5,1,3};
- int n = sizeof(arr) / sizeof(int);
- traverse(arr, n);
-
- shellsort(arr, n);
- printf("[ after shell sort ] ");
- traverse(arr, n);
- return 0;
- }
- /* subfunction */
- void shellsort(int *array, int length) // shell sort
- {
- int gap = ceil(length / 2); // steps of two comparative data
- while(gap > 0)
- {
- // from gap to the end, each element compare with data before gap steps
- for(int i = gap; i < length; i++)
- {
- // element cycle compare with data before gap steps, until 0 index
- for(int j = i; j >= gap; j -= gap)
- {
- if(array[j] < array[j - gap])
- {
- int tmp = array[j];
- array[j] = array[j - gap];
- array[j - gap] = tmp;
- }
- }
- }
- // reduce the step
- gap = ceil(gap / 2);
- }
- }
-
- void traverse(int *array, int length) // show element one by one
- {
- printf("elements(%d): ", length);
- for(int k = 0; k < length; k++)
- {
- printf("%d ", array[k]);
- }
- printf("\n");
- }

编译链接: gcc -o shellsort shellsort.c
执行可执行文件: ./shellsort
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。