/*
* Copyright (c) 2010-~ zhouyongfei
*
* The source code is released for free distribution under the terms of the GNU General Public License
*
*
* Author: alen Chou
* Created Time: 2010年07月19日 星期一 19时51分16秒
* File Name: sort2.c
* Description: 这个文件是我在复习交换类排序时写的一个文件。
* 有冒泡排序,快速排序。
*
*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
/**
*
* 冒泡排序的算法。
* @:r[]为需要排序的数组
* @:length为数组长度。
* */
void BubbleSort(int r[],int length)
{
int n = length;
int i,j,x;
int change;
change = TRUE;
/**
* 外层循环控制的是已经有几个元素排好序
* */
for(i = 0;i < n&&change;++i){
change = FALSE;
/**
* 这里的n-1-i就是当前要排序的最后一个元素的索引
* 因为后面的以后排好序了
* */
for(j = 0;j < n-1-i;++j){
if(r[j] > r[j+1]){
x = r[j];
r[j] = r[j+1];
r[j+1] = x;
change = TRUE;
}
}
}
printf("after sort:\n");
for(i = 0;i < length;i++){
printf("%d ",r[i]);
}
printf("\n");
}
/**
* 一趟快速排序算法
* @:r需要排序的数组
* @:left当前指向的左端
* @:right当前指向的右端
* */
int QKPass(int r[],int left,int right)
{
int x,low,high;
x = r[left];
low = left;
high = right;
while(low < high){
while(low < high&&r[high] >= x){
high--;
}
if(low < high){
r[low] = r[high];
low++;
}
while(low < high&&r[low] < x){
low++;
}
if(low < high){
r[high] = r[low];
high--;
}
}
r[low] = x;
return low;
}
/**
* 快速排序
* @:r需要排序的数组
* @:low需要排序部分的最左索引
* @:high需要排序部分的最右索引
* */
void QKSort(int r[],int low,int high)
{
int pos;
if(low < high){
pos = QKPass(r,low,high);
QKSort(r,low,pos-1);
QKSort(r,pos+1,high);
}
}
int main(int argc, char *argv[])
{
int i;
int arr[] = {48,62,35,77,55,14,35,98};
//int arr[] = {48,62,35,77,53};
int length = sizeof(arr)/sizeof(arr[0]);
printf("before sort:\n");
for(i = 0;i < length;i++){
printf("%d ",arr[i]);
}
printf("\n");
//BubbleSort(arr,length);
QKSort(arr,0,length-1);
printf("after sort:\n");
for(i = 0;i < length;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
} |