一個快速排序,寫的不好,大家多提意見,謝謝了..
/*
*Quick Sort For Array
*Date:20120531
*Author:Alan
*/
#include <stdio.h>
#include <stdlib.h>
typedef int Status;
Status InitArray(int **arr, int length) {
int i;
*arr = (int*)malloc(length * sizeof(int));
if(*arr == NULL){
return 0;
}
for(i = 0; i < length; i++) {
(*arr)[i] = random()%10;
}
return 1;
}
void PrintArray(int arr[], int length) {
int i;
for(i = 0; i < length; i++) {
printf("%d---", arr[i]);
}
printf("\n");
}
void Swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int Patition(int array[], int begin, int end) {
int keyPos = (begin + end)/2;
int keyData = array[keyPos];
int i = begin;
int j = end;
if(begin > end) {
return;
}
while(i != j) {
while(i < keyPos && array[i] <= keyData) {
i++;
}
if(i < keyPos) {
Swap(&array[i], &array[keyPos]);
keyPos = i;
}
while(keyPos < j && array[j] >= keyData) {
j--;
}
if(keyPos < j) {
Swap(&array[j], &array[keyPos]);
keyPos = j;
}
}
printf("keyPos = %d", i);
return i;
///////////////////////////////////////////////
/*
* Another method
* using first
* element be the keyData
*/
/*
int i, j, temp;
i = begin;
j = end;
temp = array[begin];
if(begin > end)
return;
while(i != j) {
while(array[j] >= temp && j > i)
j--;
if(j > i)
array[i++] = array[j];
while(array[i] <= temp && j > i)
i++;
if(j > i)
array[j--] = array[i];
}
array[i] = temp;
QuickSort(array, begin, i - 1);
QuickSort(array, i + 1, end);
*/
////////////////////////////////////////////
}
void QuickSort(int array[], int begin, int end) {
if(begin < end){
int p = Patition(array, begin, end);
QuickSort(array, begin, p - 1);
QuickSort(array, p + 1, end);
}
}
void main() {
int *array;
int length;
printf("How many numbers you want to generate!\n");
scanf("%d", &length);
if(InitArray(&array, length)) {
printf("Array before Quick Sort!\n");
PrintArray(array, length);
QuickSort(array, 0, length-1);
}
printf("After Sort \n");
PrintArray(array, length);
free(array);
}